From 672ce84f303f48ece701a42710a8e7d05405a5f0 Mon Sep 17 00:00:00 2001 From: Ross Stewart Date: Sat, 22 Oct 2022 11:47:02 +0000 Subject: [PATCH] Documentation update --- docs/_sources/index.rst.txt | 19 ++- docs/_static/doctools.js | 130 ++---------------- docs/_static/searchtools.js | 74 ++++++++--- docs/_static/sphinx_highlight.js | 144 ++++++++++++++++++++ docs/genindex.html | 3 +- docs/index.html | 218 +++++++++++++++++++++++++++++-- docs/py-modindex.html | 3 +- docs/search.html | 3 +- docs/searchindex.js | 2 +- 9 files changed, 433 insertions(+), 163 deletions(-) create mode 100644 docs/_static/sphinx_highlight.js diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt index de2e3ae..87f4d97 100644 --- a/docs/_sources/index.rst.txt +++ b/docs/_sources/index.rst.txt @@ -114,16 +114,21 @@ The following control intents are also supported: 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: +but this has some limitations in how the skill is invoked. -1. You need to open the skill to use it, say *Alexa, open Navisonic*. -2. 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: +The following voice commands should be successful (thanks to Raul824) - - Alexa, open Navisonic - - What is playing? +- Alexa ask Navisonic What is Playing? +- Alexa ask Navisonic to star this song. +- Alexa ask Navisonic to unstar this song. +- Alexa ask Navisonic to play rock music +- Alexa ask Navisonic to play playlist "Playlist Name" - You will then be given information about the current track and it will automatically resume. This is also required for the *star* and *unstar* intents. +If you have any problems with these, you can open the skill manually with *Alexa, open Navisonic*. 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: + +- Alexa, open Navisonic +- What is playing? Installation and Setup diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js index c3db08d..527b876 100644 --- a/docs/_static/doctools.js +++ b/docs/_static/doctools.js @@ -10,6 +10,13 @@ */ "use strict"; +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + const _ready = (callback) => { if (document.readyState !== "loading") { callback(); @@ -18,73 +25,11 @@ const _ready = (callback) => { } }; -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - /** * Small JavaScript module for the documentation. */ const Documentation = { init: () => { - Documentation.highlightSearchWords(); Documentation.initDomainIndexTable(); Documentation.initOnKeyListeners(); }, @@ -126,51 +71,6 @@ const Documentation = { Documentation.LOCALE = catalog.locale; }, - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - /** * helper function to focus on search bar */ @@ -210,15 +110,11 @@ const Documentation = { ) return; - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; if (!event.shiftKey) { switch (event.key) { @@ -240,10 +136,6 @@ const Documentation = { event.preventDefault(); } break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); } } diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js index f2fb7d5..e89e34d 100644 --- a/docs/_static/searchtools.js +++ b/docs/_static/searchtools.js @@ -57,14 +57,14 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, highlightTerms, searchTerms) => { +const _displayItem = (item, searchTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - const [docName, title, anchor, descr] = item; + const [docName, title, anchor, descr, score, _filename] = item; let listItem = document.createElement("li"); let requestUrl; @@ -82,10 +82,9 @@ const _displayItem = (item, highlightTerms, searchTerms) => { requestUrl = docUrlRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } - const params = new URLSearchParams(); - params.set("highlight", [...highlightTerms].join(" ")); let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + "?" + params.toString() + anchor; + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; linkEl.innerHTML = title; if (descr) listItem.appendChild(document.createElement("span")).innerHTML = @@ -96,7 +95,7 @@ const _displayItem = (item, highlightTerms, searchTerms) => { .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, highlightTerms) + Search.makeSearchSummary(data, searchTerms) ); }); Search.output.appendChild(listItem); @@ -116,15 +115,14 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - highlightTerms, searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), highlightTerms, searchTerms); + _displayItem(results.pop(), searchTerms); setTimeout( - () => _displayNextItem(results, resultCount, highlightTerms, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms), 5 ); } @@ -237,6 +235,12 @@ const Search = { * execute search (requires search index to be loaded) */ query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -264,6 +268,10 @@ const Search = { } }); + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + // console.debug("SEARCH: searching for:"); // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); @@ -272,6 +280,40 @@ const Search = { let results = []; _removeChildren(document.getElementById("search-progress")); + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + // lookup as object objectTerms.forEach((term) => results.push(...Search.performObjectSearch(term, objectTerms)) @@ -318,7 +360,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, highlightTerms, searchTerms); + _displayNextItem(results, results.length, searchTerms); }, /** @@ -399,8 +441,8 @@ const Search = { // prepare search const terms = Search._index.terms; const titleTerms = Search._index.titleterms; - const docNames = Search._index.docnames; const filenames = Search._index.filenames; + const docNames = Search._index.docnames; const titles = Search._index.titles; const scoreMap = new Map(); @@ -497,11 +539,9 @@ const Search = { /** * helper function to return a node containing the * search summary for a given text. keywords is a list - * of stemmed words, highlightWords is the list of normal, unstemmed - * words. the first one is used to find the occurrence, the - * latter for highlighting it. + * of stemmed words. */ - makeSearchSummary: (htmlText, keywords, highlightWords) => { + makeSearchSummary: (htmlText, keywords) => { const text = Search.htmlToText(htmlText); if (text === "") return null; @@ -519,10 +559,6 @@ const Search = { summary.classList.add("context"); summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; - highlightWords.forEach((highlightWord) => - _highlightText(summary, highlightWord, "highlighted") - ); - return summary; }, }; diff --git a/docs/_static/sphinx_highlight.js b/docs/_static/sphinx_highlight.js new file mode 100644 index 0000000..aae669d --- /dev/null +++ b/docs/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/genindex.html b/docs/genindex.html index 32ebb5a..4a36155 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -15,6 +15,7 @@ + @@ -479,7 +480,7 @@

Navigation

\ No newline at end of file diff --git a/docs/index.html b/docs/index.html index cd54083..6c5e985 100644 --- a/docs/index.html +++ b/docs/index.html @@ -16,6 +16,7 @@ + @@ -153,18 +154,21 @@

Supported Intents -
  • You need to open the skill to use it, say Alexa, open Navisonic.

  • -
  • 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:

    +but this has some limitations in how the skill is invoked.

    +

    The following voice commands should be successful (thanks to Raul824)

    +
      +
    • Alexa ask Navisonic What is Playing?

    • +
    • Alexa ask Navisonic to star this song.

    • +
    • Alexa ask Navisonic to unstar this song.

    • +
    • Alexa ask Navisonic to play rock music

    • +
    • Alexa ask Navisonic to play playlist “Playlist Name”

    • +
    +

    If you have any problems with these, you can open the skill manually with Alexa, open Navisonic. 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:

    • Alexa, open Navisonic

    • What is playing?

    -

    You will then be given information about the current track and it will automatically resume. This is also required for the star and unstar intents.

    -
  • -

    Installation and Setup

    @@ -2817,11 +2821,197 @@

    Table of Contents

  • Troubleshooting
  • Code Documentation
  • @@ -2865,7 +3055,7 @@

    Navigation

    \ No newline at end of file diff --git a/docs/py-modindex.html b/docs/py-modindex.html index d0eba43..fc79765 100644 --- a/docs/py-modindex.html +++ b/docs/py-modindex.html @@ -15,6 +15,7 @@ + @@ -105,7 +106,7 @@

    Navigation

    \ No newline at end of file diff --git a/docs/search.html b/docs/search.html index 3b82d5e..ae4eb31 100644 --- a/docs/search.html +++ b/docs/search.html @@ -16,6 +16,7 @@ + @@ -99,7 +100,7 @@

    Navigation

    \ No newline at end of file diff --git a/docs/searchindex.js b/docs/searchindex.js index bda654c..5693496 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["AskNavidrome Alexa Skill Documentation"], "terms": {"i": 0, "an": 0, "which": 0, "allow": 0, "you": 0, "plai": 0, "music": 0, "host": 0, "compat": 0, "server": 0, "like": 0, "navidrom": 0, "thi": 0, "stream": 0, "own": 0, "collect": 0, "echo": 0, "devic": 0, "without": 0, "restrict": 0, "would": 0, "normal": 0, "face": 0, "regular": 0, "amazon": 0, "spotifi": 0, "skip": 0, "backward": 0, "forward": 0, "current": 0, "playlist": 0, "limit": 0, "avoid": 0, "pai": 0, "subscript": 0, "cost": 0, "being": 0, "forc": 0, "listen": 0, "advert": 0, "interv": 0, "actual": 0, "us": 0, "have": 0, "alreadi": 0, "paid": 0, "directli": 0, "wa": 0, "inspir": 0, "askson": 0, "howev": 0, "miss": 0, "two": 0, "featur": 0, "abil": 0, "individu": 0, "song": 0, "instead": 0, "contribut": 0, "project": 0, "opt": 0, "new": 0, "base": 0, "kit": 0, "sdk": 0, "python": 0, "ha": 0, "been": 0, "updat": 0, "more": 0, "recent": 0, "than": 0, "flask": 0, "ask": 0, "replac": 0, "doe": 0, "implement": 0, "all": 0, "": 0, "viabl": 0, "altern": 0, "those": 0, "simpl": 0, "let": 0, "The": 0, "usernam": 0, "password": 0, "store": 0, "clear": 0, "text": 0, "As": 0, "need": 0, "publicli": 0, "access": 0, "chanc": 0, "could": 0, "compromis": 0, "pleas": 0, "do": 0, "administr": 0, "account": 0, "ani": 0, "other": 0, "softwar": 0, "distribut": 0, "under": 0, "mit": 0, "licens": 0, "warranti": 0, "provid": 0, "In": 0, "order": 0, "convert": 0, "digit": 0, "format": 0, "mp3": 0, "There": 0, "ar": 0, "mani": 0, "tutori": 0, "avail": 0, "help": 0, "awar": 0, "type": 0, "file": 0, "can": 0, "should": 0, "review": 0, "befor": 0, "meet": 0, "thei": 0, "transcod": 0, "them": 0, "articl": 0, "explain": 0, "audio": 0, "A": 0, "flavour": 0, "For": 0, "inform": 0, "get": 0, "set": 0, "up": 0, "check": 0, "out": 0, "websit": 0, "must": 0, "port": 0, "443": 0, "serv": 0, "request": 0, "http": 0, "valid": 0, "tl": 0, "certif": 0, "dictat": 0, "unabl": 0, "from": 0, "internet": 0, "addit": 0, "abl": 0, "mobil": 0, "app": 0, "too": 0, "free": 0, "encrypt": 0, "dynam": 0, "dn": 0, "make": 0, "afraid": 0, "org": 0, "tag": 0, "mai": 0, "seem": 0, "obviou": 0, "sure": 0, "accur": 0, "artist": 0, "titl": 0, "number": 0, "etc": 0, "onli": 0, "wai": 0, "identifi": 0, "If": 0, "tool": 0, "look": 0, "musicbrainz": 0, "picard": 0, "someth": 0, "consist": 0, "part": 0, "connect": 0, "easiest": 0, "enabl": 0, "behind": 0, "revers": 0, "proxi": 0, "also": 0, "name": 0, "descript": 0, "exampl": 0, "navisonicplaymusicbyartist": 0, "specif": 0, "where": 0, "my": 0, "mind": 0, "pixi": 0, "navisonicplayalbumbyartist": 0, "album": 0, "blue": 0, "beatl": 0, "navisonicplaysongbyartist": 0, "navisonicplayplaylist": 0, "work": 0, "navisonicplaymusicbygenr": 0, "genr": 0, "jazz": 0, "navisonicplaymusicrandom": 0, "random": 0, "mix": 0, "navisonicplayfavouritesong": 0, "star": 0, "favourit": 0, "navisonicsongdetail": 0, "give": 0, "detail": 0, "what": 0, "navisonicstarsong": 0, "navisonicunstarsong": 0, "unstar": 0, "unfavourit": 0, "follow": 0, "next": 0, "previou": 0, "back": 0, "paus": 0, "resum": 0, "due": 0, "oper": 0, "some": 0, "full": 0, "catalog": 0, "content": 0, "defeat": 0, "purpos": 0, "search": 0, "becaus": 0, "custom": 0, "along": 0, "audioplay": 0, "interfac": 0, "open": 0, "sai": 0, "navison": 0, "expect": 0, "when": 0, "invoc": 0, "want": 0, "invok": 0, "call": 0, "while": 0, "given": 0, "automat": 0, "login": 0, "builder": 0, "develop": 0, "com": 0, "same": 0, "click": 0, "wish": 0, "word": 0, "warn": 0, "rais": 0, "found": 0, "singl": 0, "still": 0, "test": 0, "It": 0, "hard": 0, "find": 0, "good": 0, "so": 0, "feel": 0, "experi": 0, "primari": 0, "local": 0, "extrem": 0, "import": 0, "match": 0, "error": 0, "messag": 0, "gener": 0, "issu": 0, "quit": 0, "difficult": 0, "via": 0, "android": 0, "troubl": 0, "default": 0, "u": 0, "first": 0, "save": 0, "few": 0, "hour": 0, "sync": 0, "No": 0, "choos": 0, "model": 0, "provis": 0, "method": 0, "backend": 0, "resourc": 0, "again": 0, "templat": 0, "start": 0, "scratch": 0, "continu": 0, "wait": 0, "upload": 0, "interact": 0, "json": 0, "editor": 0, "delet": 0, "everyth": 0, "past": 0, "To": 0, "add": 0, "each": 0, "playlist_nam": 0, "slot": 0, "maintain": 0, "list": 0, "asknavison": 0, "remov": 0, "button": 0, "done": 0, "player": 0, "endpoint": 0, "locat": 0, "select": 0, "enter": 0, "url": 0, "region": 0, "box": 0, "ssl": 0, "depend": 0, "trust": 0, "author": 0, "build": 0, "process": 0, "take": 0, "minut": 0, "just": 0, "now": 0, "publish": 0, "anyon": 0, "possibl": 0, "credenti": 0, "retriev": 0, "written": 0, "recommend": 0, "whichev": 0, "well": 0, "known": 0, "One": 0, "sever": 0, "caddi": 0, "apach": 0, "nginx": 0, "rememb": 0, "mean": 0, "3": 0, "python3": 0, "git": 0, "scm": 0, "directori": 0, "chang": 0, "clone": 0, "repositori": 0, "github": 0, "cd": 0, "rosskouk": 0, "folder": 0, "environ": 0, "variabl": 0, "execut": 0, "applic": 0, "option": 0, "section": 0, "navi_skill_id": 0, "id": 0, "navi_song_count": 0, "50": 0, "navi_url": 0, "navi_us": 0, "navi_pass": 0, "navi_port": 0, "navi_api_path": 0, "rest": 0, "navi_api_v": 0, "1": 0, "16": 0, "navi_debug": 0, "0": 0, "py": 0, "dockerfil": 0, "prebuilt": 0, "pass": 0, "command": 0, "p": 0, "5000": 0, "e": 0, "ghcr": 0, "io": 0, "kubernet": 0, "pod": 0, "side": 0, "car": 0, "renew": 0, "ingress": 0, "read": 0, "prevent": 0, "amzn1": 0, "xxxxxxxx": 0, "xxxx": 0, "xxxxxxxxxxxx": 0, "minimum": 0, "ensur": 0, "ad": 0, "least": 0, "valu": 0, "user": 0, "bob": 0, "sup3rstrongp": 0, "ssword": 0, "path": 0, "haven": 0, "t": 0, "anyth": 0, "version": 0, "debug": 0, "disabl": 0, "littl": 0, "frustrat": 0, "here": 0, "best": 0, "understand": 0, "effect": 0, "function": 0, "noth": 0, "translat": 0, "perform": 0, "task": 0, "veri": 0, "go": 0, "wrong": 0, "thing": 0, "mismatch": 0, "happen": 0, "try": 0, "correctli": 0, "cannot": 0, "commun": 0, "might": 0, "phrase": 0, "consol": 0, "includ": 0, "me": 0, "though": 0, "log": 0, "page": 0, "show": 0, "histori": 0, "buffer": 0, "note": 0, "differ": 0, "queu": 0, "finish": 0, "thought": 0, "sent": 0, "respons": 0, "between": 0, "simul": 0, "uncov": 0, "hidden": 0, "tick": 0, "instruct": 0, "microphon": 0, "after": 0, "scroll": 0, "down": 0, "through": 0, "entri": 0, "were": 0, "thrown": 0, "class": 0, "checkaudiointerfacehandl": 0, "handler": 0, "thu": 0, "respond": 0, "unsupport": 0, "much": 0, "can_handl": 0, "handler_input": 0, "handlerinput": 0, "bool": 0, "return": 0, "true": 0, "handl": 0, "input": 0, "paramet": 0, "instanc": 0, "envelop": 0, "boolean": 0, "tell": 0, "dispatch": 0, "none": 0, "union": 0, "generalexceptionhandl": 0, "except": 0, "print": 0, "dure": 0, "whether": 0, "object": 0, "helphandl": 0, "helpint": 0, "launchrequesthandl": 0, "launchrequest": 0, "navigatehomeint": 0, "loggingrequestinterceptor": 0, "intercept": 0, "loggingresponseinterceptor": 0, "ask_sdk_model": 0, "result": 0, "shuffl": 0, "exist": 0, "nextplaybackhandl": 0, "nextint": 0, "pauseplaybackhandl": 0, "stop": 0, "cancel": 0, "pausecommandissu": 0, "event": 0, "playbackfailedeventhandl": 0, "playbackfail": 0, "direct": 0, "receiv": 0, "restart": 0, "output": 0, "speech": 0, "playbackfinishedhandl": 0, "playbackfinish": 0, "confirm": 0, "complet": 0, "send": 0, "playbacknearlyfinishedhandl": 0, "playbacknearlyfinish": 0, "live": 0, "playbackstartedhandl": 0, "playbackstart": 0, "began": 0, "playbackstoppedhandl": 0, "playbackstop": 0, "previousplaybackhandl": 0, "previousint": 0, "resumeplaybackhandl": 0, "playaudio": 0, "skilleventhandl": 0, "close": 0, "session": 0, "end": 0, "skillen": 0, "skilldis": 0, "systemexceptionhandl": 0, "system": 0, "exceptionencount": 0, "view_buff": 0, "view": 0, "play_queu": 0, "tabul": 0, "contin": 0, "dequ": 0, "view_histori": 0, "view_queu": 0, "add_screen_background": 0, "card_data": 0, "dict": 0, "audioitemmetadata": 0, "background": 0, "card": 0, "viewabl": 0, "screen": 0, "dictionari": 0, "data": 0, "present": 0, "enqueue_song": 0, "subsonicconnect": 0, "mediaqueu": 0, "song_id_list": 0, "enqueu": 0, "start_playback": 0, "mode": 0, "str": 0, "track_detail": 0, "begin": 0, "doc": 0, "refer": 0, "html": 0, "replace_al": 0, "immedi": 0, "playback": 0, "specifi": 0, "spoken": 0, "displai": 0, "media_queu": 0, "attribut": 0, "add_track": 0, "enqueue_next_track": 0, "earli": 0, "get_history_count": 0, "int": 0, "get_next_track": 0, "self": 0, "get_prevous_track": 0, "last": 0, "front": 0, "get_queue_count": 0, "reset": 0, "playbehaviour": 0, "syncronis": 0, "overwrit": 0, "correct": 0, "practic": 0, "action": 0, "current_track": 0, "caus": 0, "lose": 0, "real": 0, "posit": 0, "properti": 0, "hold": 0, "logger": 0, "subsonic_api": 0, "server_url": 0, "passwd": 0, "api_loc": 0, "api_vers": 0, "authent": 0, "against": 0, "compatib": 0, "append": 0, "albums_by_artist": 0, "build_random_song_list": 0, "count": 0, "build_song_list_from_album": 0, "length": 0, "keep": 0, "until": 0, "song_count": 0, "greater": 0, "equal": 0, "build_song_list_from_favourit": 0, "build_song_list_from_genr": 0, "accept": 0, "getgenr": 0, "build_song_list_from_playlist": 0, "get_song_detail": 0, "get_song_uri": 0, "uri": 0, "repres": 0, "embed": 0, "properli": 0, "ping": 0, "verifi": 0, "fals": 0, "search_album": 0, "term": 0, "search_artist": 0, "search_playlist": 0, "search_song": 0, "star_entri": 0, "entiti": 0, "unstar_entri": 0, "artist_id": 0, "album_id": 0, "track_no": 0, "year": 0, "durat": 0, "bitrat": 0, "offset": 0, "previous_id": 0, "releas": 0, "second": 0, "bit": 0, "rate": 0, "kbp": 0, "millisecond": 0}, "objects": {"": [[0, 0, 0, "-", "app"]], "app": [[0, 1, 1, "", "CheckAudioInterfaceHandler"], [0, 1, 1, "", "GeneralExceptionHandler"], [0, 1, 1, "", "HelpHandler"], [0, 1, 1, "", "LaunchRequestHandler"], [0, 1, 1, "", "LoggingRequestInterceptor"], [0, 1, 1, "", "LoggingResponseInterceptor"], [0, 1, 1, "", "NaviSonicPlayAlbumByArtist"], [0, 1, 1, "", "NaviSonicPlayFavouriteSongs"], [0, 1, 1, "", "NaviSonicPlayMusicByArtist"], [0, 1, 1, "", "NaviSonicPlayMusicByGenre"], [0, 1, 1, "", "NaviSonicPlayMusicRandom"], [0, 1, 1, "", "NaviSonicPlayPlaylist"], [0, 1, 1, "", "NaviSonicPlaySongByArtist"], [0, 1, 1, "", "NaviSonicSongDetails"], [0, 1, 1, "", "NaviSonicStarSong"], [0, 1, 1, "", "NaviSonicUnstarSong"], [0, 1, 1, "", "NextPlaybackHandler"], [0, 1, 1, "", "PausePlaybackHandler"], [0, 1, 1, "", "PlaybackFailedEventHandler"], [0, 1, 1, "", "PlaybackFinishedHandler"], [0, 1, 1, "", "PlaybackNearlyFinishedHandler"], [0, 1, 1, "", "PlaybackStartedHandler"], [0, 1, 1, "", "PlaybackStoppedHandler"], [0, 1, 1, "", "PreviousPlaybackHandler"], [0, 1, 1, "", "ResumePlaybackHandler"], [0, 1, 1, "", "SkillEventHandler"], [0, 1, 1, "", "SystemExceptionHandler"], [0, 3, 1, "", "view_buffer"], [0, 3, 1, "", "view_history"], [0, 3, 1, "", "view_queue"]], "app.CheckAudioInterfaceHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.GeneralExceptionHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.HelpHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.LaunchRequestHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.LoggingRequestInterceptor": [[0, 2, 1, "", "process"]], "app.LoggingResponseInterceptor": [[0, 2, 1, "", "process"]], "app.NaviSonicPlayAlbumByArtist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayFavouriteSongs": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayMusicByArtist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayMusicByGenre": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayMusicRandom": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayPlaylist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlaySongByArtist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicSongDetails": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicStarSong": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicUnstarSong": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NextPlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PausePlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackFailedEventHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackFinishedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackNearlyFinishedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackStartedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackStoppedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PreviousPlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.ResumePlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.SkillEventHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.SystemExceptionHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "asknavidrome": [[0, 0, 0, "-", "controller"]], "asknavidrome.controller": [[0, 3, 1, "", "add_screen_background"], [0, 3, 1, "", "enqueue_songs"], [0, 3, 1, "", "start_playback"], [0, 3, 1, "", "stop"]], "asknavidrome.media_queue": [[0, 1, 1, "", "MediaQueue"]], "asknavidrome.media_queue.MediaQueue": [[0, 2, 1, "", "add_track"], [0, 4, 1, "", "buffer"], [0, 2, 1, "", "clear"], [0, 4, 1, "", "current_track"], [0, 2, 1, "", "enqueue_next_track"], [0, 2, 1, "", "get_history_count"], [0, 2, 1, "", "get_next_track"], [0, 2, 1, "", "get_prevous_track"], [0, 2, 1, "", "get_queue_count"], [0, 4, 1, "", "history"], [0, 4, 1, "", "logger"], [0, 4, 1, "", "queue"], [0, 2, 1, "", "shuffle"], [0, 2, 1, "", "sync"]], "asknavidrome.subsonic_api": [[0, 1, 1, "", "SubsonicConnection"]], "asknavidrome.subsonic_api.SubsonicConnection": [[0, 2, 1, "", "albums_by_artist"], [0, 2, 1, "", "build_random_song_list"], [0, 2, 1, "", "build_song_list_from_albums"], [0, 2, 1, "", "build_song_list_from_favourites"], [0, 2, 1, "", "build_song_list_from_genre"], [0, 2, 1, "", "build_song_list_from_playlist"], [0, 2, 1, "", "get_song_details"], [0, 2, 1, "", "get_song_uri"], [0, 2, 1, "", "ping"], [0, 2, 1, "", "search_album"], [0, 2, 1, "", "search_artist"], [0, 2, 1, "", "search_playlist"], [0, 2, 1, "", "search_song"], [0, 2, 1, "", "star_entry"], [0, 2, 1, "", "unstar_entry"]], "asknavidrome.track": [[0, 1, 1, "", "Track"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"asknavidrom": 0, "alexa": 0, "skill": 0, "document": 0, "requir": 0, "about": 0, "support": 0, "intent": 0, "instal": 0, "setup": 0, "creat": 0, "deploi": 0, "web": 0, "servic": 0, "run": 0, "your": 0, "pc": 0, "insid": 0, "docker": 0, "contain": 0, "configur": 0, "troubleshoot": 0, "code": 0, "main": 0, "control": 0, "media": 0, "queue": 0, "subson": 0, "api": 0, "track": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["AskNavidrome Alexa Skill Documentation"], "terms": {"i": 0, "an": 0, "which": 0, "allow": 0, "you": 0, "plai": 0, "music": 0, "host": 0, "compat": 0, "server": 0, "like": 0, "navidrom": 0, "thi": 0, "stream": 0, "own": 0, "collect": 0, "echo": 0, "devic": 0, "without": 0, "restrict": 0, "would": 0, "normal": 0, "face": 0, "regular": 0, "amazon": 0, "spotifi": 0, "skip": 0, "backward": 0, "forward": 0, "current": 0, "playlist": 0, "limit": 0, "avoid": 0, "pai": 0, "subscript": 0, "cost": 0, "being": 0, "forc": 0, "listen": 0, "advert": 0, "interv": 0, "actual": 0, "us": 0, "have": 0, "alreadi": 0, "paid": 0, "directli": 0, "wa": 0, "inspir": 0, "askson": 0, "howev": 0, "miss": 0, "two": 0, "featur": 0, "abil": 0, "individu": 0, "song": 0, "instead": 0, "contribut": 0, "project": 0, "opt": 0, "new": 0, "base": 0, "kit": 0, "sdk": 0, "python": 0, "ha": 0, "been": 0, "updat": 0, "more": 0, "recent": 0, "than": 0, "flask": 0, "ask": 0, "replac": 0, "doe": 0, "implement": 0, "all": 0, "": 0, "viabl": 0, "altern": 0, "those": 0, "simpl": 0, "let": 0, "The": 0, "usernam": 0, "password": 0, "store": 0, "clear": 0, "text": 0, "As": 0, "need": 0, "publicli": 0, "access": 0, "chanc": 0, "could": 0, "compromis": 0, "pleas": 0, "do": 0, "administr": 0, "account": 0, "ani": 0, "other": 0, "softwar": 0, "distribut": 0, "under": 0, "mit": 0, "licens": 0, "warranti": 0, "provid": 0, "In": 0, "order": 0, "convert": 0, "digit": 0, "format": 0, "mp3": 0, "There": 0, "ar": 0, "mani": 0, "tutori": 0, "avail": 0, "help": 0, "awar": 0, "type": 0, "file": 0, "can": 0, "should": 0, "review": 0, "befor": 0, "meet": 0, "thei": 0, "transcod": 0, "them": 0, "articl": 0, "explain": 0, "audio": 0, "A": 0, "flavour": 0, "For": 0, "inform": 0, "get": 0, "set": 0, "up": 0, "check": 0, "out": 0, "websit": 0, "must": 0, "port": 0, "443": 0, "serv": 0, "request": 0, "http": 0, "valid": 0, "tl": 0, "certif": 0, "dictat": 0, "unabl": 0, "from": 0, "internet": 0, "addit": 0, "abl": 0, "mobil": 0, "app": 0, "too": 0, "free": 0, "encrypt": 0, "dynam": 0, "dn": 0, "make": 0, "afraid": 0, "org": 0, "tag": 0, "mai": 0, "seem": 0, "obviou": 0, "sure": 0, "accur": 0, "artist": 0, "titl": 0, "number": 0, "etc": 0, "onli": 0, "wai": 0, "identifi": 0, "If": 0, "tool": 0, "look": 0, "musicbrainz": 0, "picard": 0, "someth": 0, "consist": 0, "part": 0, "connect": 0, "easiest": 0, "enabl": 0, "behind": 0, "revers": 0, "proxi": 0, "also": 0, "name": 0, "descript": 0, "exampl": 0, "navisonicplaymusicbyartist": 0, "specif": 0, "where": 0, "my": 0, "mind": 0, "pixi": 0, "navisonicplayalbumbyartist": 0, "album": 0, "blue": 0, "beatl": 0, "navisonicplaysongbyartist": 0, "navisonicplayplaylist": 0, "work": 0, "navisonicplaymusicbygenr": 0, "genr": 0, "jazz": 0, "navisonicplaymusicrandom": 0, "random": 0, "mix": 0, "navisonicplayfavouritesong": 0, "star": 0, "favourit": 0, "navisonicsongdetail": 0, "give": 0, "detail": 0, "what": 0, "navisonicstarsong": 0, "navisonicunstarsong": 0, "unstar": 0, "unfavourit": 0, "follow": 0, "next": 0, "previou": 0, "back": 0, "paus": 0, "resum": 0, "due": 0, "oper": 0, "some": 0, "full": 0, "catalog": 0, "content": 0, "defeat": 0, "purpos": 0, "search": 0, "becaus": 0, "custom": 0, "along": 0, "audioplay": 0, "interfac": 0, "how": 0, "invok": 0, "voic": 0, "command": 0, "success": 0, "thank": 0, "raul824": 0, "navison": 0, "rock": 0, "problem": 0, "open": 0, "manual": 0, "similarli": 0, "done": 0, "when": 0, "want": 0, "call": 0, "sai": 0, "while": 0, "login": 0, "builder": 0, "develop": 0, "com": 0, "same": 0, "click": 0, "wish": 0, "word": 0, "warn": 0, "rais": 0, "found": 0, "singl": 0, "still": 0, "test": 0, "It": 0, "hard": 0, "find": 0, "good": 0, "so": 0, "feel": 0, "experi": 0, "primari": 0, "local": 0, "extrem": 0, "import": 0, "match": 0, "error": 0, "messag": 0, "gener": 0, "issu": 0, "quit": 0, "difficult": 0, "via": 0, "android": 0, "troubl": 0, "default": 0, "u": 0, "first": 0, "save": 0, "few": 0, "hour": 0, "sync": 0, "No": 0, "choos": 0, "model": 0, "provis": 0, "method": 0, "backend": 0, "resourc": 0, "again": 0, "templat": 0, "start": 0, "scratch": 0, "continu": 0, "wait": 0, "upload": 0, "interact": 0, "json": 0, "editor": 0, "delet": 0, "everyth": 0, "past": 0, "To": 0, "add": 0, "each": 0, "playlist_nam": 0, "slot": 0, "maintain": 0, "list": 0, "asknavison": 0, "remov": 0, "button": 0, "player": 0, "endpoint": 0, "locat": 0, "select": 0, "enter": 0, "url": 0, "region": 0, "box": 0, "ssl": 0, "depend": 0, "trust": 0, "author": 0, "build": 0, "invoc": 0, "process": 0, "take": 0, "minut": 0, "just": 0, "now": 0, "publish": 0, "anyon": 0, "possibl": 0, "credenti": 0, "retriev": 0, "written": 0, "recommend": 0, "whichev": 0, "well": 0, "known": 0, "One": 0, "sever": 0, "caddi": 0, "apach": 0, "nginx": 0, "rememb": 0, "mean": 0, "3": 0, "python3": 0, "git": 0, "scm": 0, "directori": 0, "chang": 0, "clone": 0, "repositori": 0, "github": 0, "cd": 0, "rosskouk": 0, "folder": 0, "environ": 0, "variabl": 0, "execut": 0, "applic": 0, "option": 0, "section": 0, "navi_skill_id": 0, "id": 0, "navi_song_count": 0, "50": 0, "navi_url": 0, "navi_us": 0, "navi_pass": 0, "navi_port": 0, "navi_api_path": 0, "rest": 0, "navi_api_v": 0, "1": 0, "16": 0, "navi_debug": 0, "0": 0, "py": 0, "dockerfil": 0, "prebuilt": 0, "pass": 0, "p": 0, "5000": 0, "e": 0, "ghcr": 0, "io": 0, "kubernet": 0, "pod": 0, "side": 0, "car": 0, "automat": 0, "renew": 0, "ingress": 0, "read": 0, "prevent": 0, "amzn1": 0, "xxxxxxxx": 0, "xxxx": 0, "xxxxxxxxxxxx": 0, "minimum": 0, "ensur": 0, "ad": 0, "least": 0, "valu": 0, "user": 0, "bob": 0, "sup3rstrongp": 0, "ssword": 0, "path": 0, "haven": 0, "t": 0, "anyth": 0, "version": 0, "debug": 0, "disabl": 0, "littl": 0, "frustrat": 0, "here": 0, "best": 0, "understand": 0, "effect": 0, "function": 0, "noth": 0, "translat": 0, "perform": 0, "task": 0, "veri": 0, "go": 0, "wrong": 0, "thing": 0, "mismatch": 0, "happen": 0, "try": 0, "correctli": 0, "cannot": 0, "commun": 0, "might": 0, "phrase": 0, "consol": 0, "includ": 0, "me": 0, "though": 0, "log": 0, "page": 0, "show": 0, "histori": 0, "buffer": 0, "note": 0, "differ": 0, "queu": 0, "finish": 0, "thought": 0, "sent": 0, "respons": 0, "between": 0, "simul": 0, "uncov": 0, "hidden": 0, "tick": 0, "instruct": 0, "microphon": 0, "after": 0, "scroll": 0, "down": 0, "through": 0, "entri": 0, "were": 0, "thrown": 0, "class": 0, "checkaudiointerfacehandl": 0, "handler": 0, "thu": 0, "respond": 0, "unsupport": 0, "much": 0, "can_handl": 0, "handler_input": 0, "handlerinput": 0, "bool": 0, "return": 0, "true": 0, "handl": 0, "input": 0, "paramet": 0, "instanc": 0, "envelop": 0, "boolean": 0, "tell": 0, "dispatch": 0, "none": 0, "union": 0, "generalexceptionhandl": 0, "except": 0, "print": 0, "dure": 0, "whether": 0, "object": 0, "helphandl": 0, "helpint": 0, "launchrequesthandl": 0, "launchrequest": 0, "navigatehomeint": 0, "loggingrequestinterceptor": 0, "intercept": 0, "loggingresponseinterceptor": 0, "ask_sdk_model": 0, "result": 0, "given": 0, "shuffl": 0, "exist": 0, "nextplaybackhandl": 0, "nextint": 0, "pauseplaybackhandl": 0, "stop": 0, "cancel": 0, "pausecommandissu": 0, "event": 0, "playbackfailedeventhandl": 0, "playbackfail": 0, "direct": 0, "receiv": 0, "restart": 0, "output": 0, "speech": 0, "playbackfinishedhandl": 0, "playbackfinish": 0, "confirm": 0, "complet": 0, "send": 0, "playbacknearlyfinishedhandl": 0, "playbacknearlyfinish": 0, "live": 0, "playbackstartedhandl": 0, "playbackstart": 0, "began": 0, "playbackstoppedhandl": 0, "playbackstop": 0, "previousplaybackhandl": 0, "previousint": 0, "resumeplaybackhandl": 0, "playaudio": 0, "skilleventhandl": 0, "close": 0, "session": 0, "end": 0, "skillen": 0, "skilldis": 0, "systemexceptionhandl": 0, "system": 0, "exceptionencount": 0, "view_buff": 0, "view": 0, "play_queu": 0, "tabul": 0, "contin": 0, "dequ": 0, "view_histori": 0, "view_queu": 0, "add_screen_background": 0, "card_data": 0, "dict": 0, "audioitemmetadata": 0, "background": 0, "card": 0, "viewabl": 0, "screen": 0, "dictionari": 0, "data": 0, "present": 0, "enqueue_song": 0, "subsonicconnect": 0, "mediaqueu": 0, "song_id_list": 0, "enqueu": 0, "start_playback": 0, "mode": 0, "str": 0, "track_detail": 0, "begin": 0, "doc": 0, "refer": 0, "html": 0, "replace_al": 0, "immedi": 0, "playback": 0, "specifi": 0, "spoken": 0, "displai": 0, "media_queu": 0, "attribut": 0, "add_track": 0, "enqueue_next_track": 0, "earli": 0, "get_history_count": 0, "int": 0, "get_next_track": 0, "self": 0, "get_prevous_track": 0, "last": 0, "front": 0, "get_queue_count": 0, "reset": 0, "playbehaviour": 0, "syncronis": 0, "overwrit": 0, "correct": 0, "practic": 0, "action": 0, "current_track": 0, "caus": 0, "lose": 0, "real": 0, "posit": 0, "properti": 0, "hold": 0, "logger": 0, "subsonic_api": 0, "server_url": 0, "passwd": 0, "api_loc": 0, "api_vers": 0, "authent": 0, "against": 0, "compatib": 0, "append": 0, "albums_by_artist": 0, "build_random_song_list": 0, "count": 0, "build_song_list_from_album": 0, "length": 0, "keep": 0, "until": 0, "song_count": 0, "greater": 0, "equal": 0, "build_song_list_from_favourit": 0, "build_song_list_from_genr": 0, "accept": 0, "getgenr": 0, "build_song_list_from_playlist": 0, "get_song_detail": 0, "get_song_uri": 0, "uri": 0, "repres": 0, "embed": 0, "properli": 0, "ping": 0, "verifi": 0, "fals": 0, "search_album": 0, "term": 0, "search_artist": 0, "search_playlist": 0, "search_song": 0, "star_entri": 0, "entiti": 0, "unstar_entri": 0, "artist_id": 0, "album_id": 0, "track_no": 0, "year": 0, "durat": 0, "bitrat": 0, "offset": 0, "previous_id": 0, "releas": 0, "second": 0, "bit": 0, "rate": 0, "kbp": 0, "millisecond": 0}, "objects": {"": [[0, 0, 0, "-", "app"]], "app": [[0, 1, 1, "", "CheckAudioInterfaceHandler"], [0, 1, 1, "", "GeneralExceptionHandler"], [0, 1, 1, "", "HelpHandler"], [0, 1, 1, "", "LaunchRequestHandler"], [0, 1, 1, "", "LoggingRequestInterceptor"], [0, 1, 1, "", "LoggingResponseInterceptor"], [0, 1, 1, "", "NaviSonicPlayAlbumByArtist"], [0, 1, 1, "", "NaviSonicPlayFavouriteSongs"], [0, 1, 1, "", "NaviSonicPlayMusicByArtist"], [0, 1, 1, "", "NaviSonicPlayMusicByGenre"], [0, 1, 1, "", "NaviSonicPlayMusicRandom"], [0, 1, 1, "", "NaviSonicPlayPlaylist"], [0, 1, 1, "", "NaviSonicPlaySongByArtist"], [0, 1, 1, "", "NaviSonicSongDetails"], [0, 1, 1, "", "NaviSonicStarSong"], [0, 1, 1, "", "NaviSonicUnstarSong"], [0, 1, 1, "", "NextPlaybackHandler"], [0, 1, 1, "", "PausePlaybackHandler"], [0, 1, 1, "", "PlaybackFailedEventHandler"], [0, 1, 1, "", "PlaybackFinishedHandler"], [0, 1, 1, "", "PlaybackNearlyFinishedHandler"], [0, 1, 1, "", "PlaybackStartedHandler"], [0, 1, 1, "", "PlaybackStoppedHandler"], [0, 1, 1, "", "PreviousPlaybackHandler"], [0, 1, 1, "", "ResumePlaybackHandler"], [0, 1, 1, "", "SkillEventHandler"], [0, 1, 1, "", "SystemExceptionHandler"], [0, 3, 1, "", "view_buffer"], [0, 3, 1, "", "view_history"], [0, 3, 1, "", "view_queue"]], "app.CheckAudioInterfaceHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.GeneralExceptionHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.HelpHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.LaunchRequestHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.LoggingRequestInterceptor": [[0, 2, 1, "", "process"]], "app.LoggingResponseInterceptor": [[0, 2, 1, "", "process"]], "app.NaviSonicPlayAlbumByArtist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayFavouriteSongs": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayMusicByArtist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayMusicByGenre": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayMusicRandom": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlayPlaylist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicPlaySongByArtist": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicSongDetails": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicStarSong": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NaviSonicUnstarSong": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.NextPlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PausePlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackFailedEventHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackFinishedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackNearlyFinishedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackStartedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PlaybackStoppedHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.PreviousPlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.ResumePlaybackHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.SkillEventHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "app.SystemExceptionHandler": [[0, 2, 1, "", "can_handle"], [0, 2, 1, "", "handle"]], "asknavidrome": [[0, 0, 0, "-", "controller"]], "asknavidrome.controller": [[0, 3, 1, "", "add_screen_background"], [0, 3, 1, "", "enqueue_songs"], [0, 3, 1, "", "start_playback"], [0, 3, 1, "", "stop"]], "asknavidrome.media_queue": [[0, 1, 1, "", "MediaQueue"]], "asknavidrome.media_queue.MediaQueue": [[0, 2, 1, "", "add_track"], [0, 4, 1, "", "buffer"], [0, 2, 1, "", "clear"], [0, 4, 1, "", "current_track"], [0, 2, 1, "", "enqueue_next_track"], [0, 2, 1, "", "get_history_count"], [0, 2, 1, "", "get_next_track"], [0, 2, 1, "", "get_prevous_track"], [0, 2, 1, "", "get_queue_count"], [0, 4, 1, "", "history"], [0, 4, 1, "", "logger"], [0, 4, 1, "", "queue"], [0, 2, 1, "", "shuffle"], [0, 2, 1, "", "sync"]], "asknavidrome.subsonic_api": [[0, 1, 1, "", "SubsonicConnection"]], "asknavidrome.subsonic_api.SubsonicConnection": [[0, 2, 1, "", "albums_by_artist"], [0, 2, 1, "", "build_random_song_list"], [0, 2, 1, "", "build_song_list_from_albums"], [0, 2, 1, "", "build_song_list_from_favourites"], [0, 2, 1, "", "build_song_list_from_genre"], [0, 2, 1, "", "build_song_list_from_playlist"], [0, 2, 1, "", "get_song_details"], [0, 2, 1, "", "get_song_uri"], [0, 2, 1, "", "ping"], [0, 2, 1, "", "search_album"], [0, 2, 1, "", "search_artist"], [0, 2, 1, "", "search_playlist"], [0, 2, 1, "", "search_song"], [0, 2, 1, "", "star_entry"], [0, 2, 1, "", "unstar_entry"]], "asknavidrome.track": [[0, 1, 1, "", "Track"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"asknavidrom": 0, "alexa": 0, "skill": 0, "document": 0, "requir": 0, "about": 0, "support": 0, "intent": 0, "instal": 0, "setup": 0, "creat": 0, "deploi": 0, "web": 0, "servic": 0, "run": 0, "your": 0, "pc": 0, "insid": 0, "docker": 0, "contain": 0, "configur": 0, "troubleshoot": 0, "code": 0, "main": 0, "control": 0, "media": 0, "queue": 0, "subson": 0, "api": 0, "track": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 57}, "alltitles": {"AskNavidrome Alexa Skill Documentation": [[0, "asknavidrome-alexa-skill-documentation"]], "Requirements": [[0, "requirements"]], "About the AskNavidrome Skill": [[0, "about-the-asknavidrome-skill"]], "Supported Intents": [[0, "supported-intents"]], "Installation and Setup": [[0, "installation-and-setup"]], "Creating the AskNavidrome Alexa Skill": [[0, "creating-the-asknavidrome-alexa-skill"]], "Deploying the AskNavidrome Web Service": [[0, "deploying-the-asknavidrome-web-service"]], "Run on your PC": [[0, "run-on-your-pc"]], "Run inside a Docker container": [[0, "run-inside-a-docker-container"]], "Configuration": [[0, "configuration"]], "Troubleshooting": [[0, "troubleshooting"]], "Code Documentation": [[0, "code-documentation"]], "AskNavidrome main": [[0, "module-app"]], "AskNavidrome controller": [[0, "module-asknavidrome.controller"]], "AskNavidrome media queue": [[0, "asknavidrome-media-queue"]], "AskNavidrome subsonic API": [[0, "asknavidrome-subsonic-api"]], "AskNavidrome track": [[0, "asknavidrome-track"]]}, "indexentries": {"checkaudiointerfacehandler (class in app)": [[0, "app.CheckAudioInterfaceHandler"]], "generalexceptionhandler (class in app)": [[0, "app.GeneralExceptionHandler"]], "helphandler (class in app)": [[0, "app.HelpHandler"]], "launchrequesthandler (class in app)": [[0, "app.LaunchRequestHandler"]], "loggingrequestinterceptor (class in app)": [[0, "app.LoggingRequestInterceptor"]], "loggingresponseinterceptor (class in app)": [[0, "app.LoggingResponseInterceptor"]], "mediaqueue (class in asknavidrome.media_queue)": [[0, "asknavidrome.media_queue.MediaQueue"]], "navisonicplayalbumbyartist (class in app)": [[0, "app.NaviSonicPlayAlbumByArtist"]], "navisonicplayfavouritesongs (class in app)": [[0, "app.NaviSonicPlayFavouriteSongs"]], "navisonicplaymusicbyartist (class in app)": [[0, "app.NaviSonicPlayMusicByArtist"]], "navisonicplaymusicbygenre (class in app)": [[0, "app.NaviSonicPlayMusicByGenre"]], "navisonicplaymusicrandom (class in app)": [[0, "app.NaviSonicPlayMusicRandom"]], "navisonicplayplaylist (class in app)": [[0, "app.NaviSonicPlayPlaylist"]], "navisonicplaysongbyartist (class in app)": [[0, "app.NaviSonicPlaySongByArtist"]], "navisonicsongdetails (class in app)": [[0, "app.NaviSonicSongDetails"]], "navisonicstarsong (class in app)": [[0, "app.NaviSonicStarSong"]], "navisonicunstarsong (class in app)": [[0, "app.NaviSonicUnstarSong"]], "nextplaybackhandler (class in app)": [[0, "app.NextPlaybackHandler"]], "pauseplaybackhandler (class in app)": [[0, "app.PausePlaybackHandler"]], "playbackfailedeventhandler (class in app)": [[0, "app.PlaybackFailedEventHandler"]], "playbackfinishedhandler (class in app)": [[0, "app.PlaybackFinishedHandler"]], "playbacknearlyfinishedhandler (class in app)": [[0, "app.PlaybackNearlyFinishedHandler"]], "playbackstartedhandler (class in app)": [[0, "app.PlaybackStartedHandler"]], "playbackstoppedhandler (class in app)": [[0, "app.PlaybackStoppedHandler"]], "previousplaybackhandler (class in app)": [[0, "app.PreviousPlaybackHandler"]], "resumeplaybackhandler (class in app)": [[0, "app.ResumePlaybackHandler"]], "skilleventhandler (class in app)": [[0, "app.SkillEventHandler"]], "subsonicconnection (class in asknavidrome.subsonic_api)": [[0, "asknavidrome.subsonic_api.SubsonicConnection"]], "systemexceptionhandler (class in app)": [[0, "app.SystemExceptionHandler"]], "track (class in asknavidrome.track)": [[0, "asknavidrome.track.Track"]], "add_screen_background() (in module asknavidrome.controller)": [[0, "asknavidrome.controller.add_screen_background"]], "add_track() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.add_track"]], "albums_by_artist() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist"]], "app": [[0, "module-app"]], "asknavidrome.controller": [[0, "module-asknavidrome.controller"]], "buffer (asknavidrome.media_queue.mediaqueue attribute)": [[0, "asknavidrome.media_queue.MediaQueue.buffer"]], "build_random_song_list() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list"]], "build_song_list_from_albums() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums"]], "build_song_list_from_favourites() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites"]], "build_song_list_from_genre() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre"]], "build_song_list_from_playlist() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist"]], "can_handle() (app.checkaudiointerfacehandler method)": [[0, "app.CheckAudioInterfaceHandler.can_handle"]], "can_handle() (app.generalexceptionhandler method)": [[0, "app.GeneralExceptionHandler.can_handle"]], "can_handle() (app.helphandler method)": [[0, "app.HelpHandler.can_handle"]], "can_handle() (app.launchrequesthandler method)": [[0, "app.LaunchRequestHandler.can_handle"]], "can_handle() (app.navisonicplayalbumbyartist method)": [[0, "app.NaviSonicPlayAlbumByArtist.can_handle"]], "can_handle() (app.navisonicplayfavouritesongs method)": [[0, "app.NaviSonicPlayFavouriteSongs.can_handle"]], "can_handle() (app.navisonicplaymusicbyartist method)": [[0, "app.NaviSonicPlayMusicByArtist.can_handle"]], "can_handle() (app.navisonicplaymusicbygenre method)": [[0, "app.NaviSonicPlayMusicByGenre.can_handle"]], "can_handle() (app.navisonicplaymusicrandom method)": [[0, "app.NaviSonicPlayMusicRandom.can_handle"]], "can_handle() (app.navisonicplayplaylist method)": [[0, "app.NaviSonicPlayPlaylist.can_handle"]], "can_handle() (app.navisonicplaysongbyartist method)": [[0, "app.NaviSonicPlaySongByArtist.can_handle"]], "can_handle() (app.navisonicsongdetails method)": [[0, "app.NaviSonicSongDetails.can_handle"]], "can_handle() (app.navisonicstarsong method)": [[0, "app.NaviSonicStarSong.can_handle"]], "can_handle() (app.navisonicunstarsong method)": [[0, "app.NaviSonicUnstarSong.can_handle"]], "can_handle() (app.nextplaybackhandler method)": [[0, "app.NextPlaybackHandler.can_handle"]], "can_handle() (app.pauseplaybackhandler method)": [[0, "app.PausePlaybackHandler.can_handle"]], "can_handle() (app.playbackfailedeventhandler method)": [[0, "app.PlaybackFailedEventHandler.can_handle"]], "can_handle() (app.playbackfinishedhandler method)": [[0, "app.PlaybackFinishedHandler.can_handle"]], "can_handle() (app.playbacknearlyfinishedhandler method)": [[0, "app.PlaybackNearlyFinishedHandler.can_handle"]], "can_handle() (app.playbackstartedhandler method)": [[0, "app.PlaybackStartedHandler.can_handle"]], "can_handle() (app.playbackstoppedhandler method)": [[0, "app.PlaybackStoppedHandler.can_handle"]], "can_handle() (app.previousplaybackhandler method)": [[0, "app.PreviousPlaybackHandler.can_handle"]], "can_handle() (app.resumeplaybackhandler method)": [[0, "app.ResumePlaybackHandler.can_handle"]], "can_handle() (app.skilleventhandler method)": [[0, "app.SkillEventHandler.can_handle"]], "can_handle() (app.systemexceptionhandler method)": [[0, "app.SystemExceptionHandler.can_handle"]], "clear() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.clear"]], "current_track (asknavidrome.media_queue.mediaqueue attribute)": [[0, "asknavidrome.media_queue.MediaQueue.current_track"]], "enqueue_next_track() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.enqueue_next_track"]], "enqueue_songs() (in module asknavidrome.controller)": [[0, "asknavidrome.controller.enqueue_songs"]], "get_history_count() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.get_history_count"]], "get_next_track() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.get_next_track"]], "get_prevous_track() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.get_prevous_track"]], "get_queue_count() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.get_queue_count"]], "get_song_details() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.get_song_details"]], "get_song_uri() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.get_song_uri"]], "handle() (app.checkaudiointerfacehandler method)": [[0, "app.CheckAudioInterfaceHandler.handle"]], "handle() (app.generalexceptionhandler method)": [[0, "app.GeneralExceptionHandler.handle"]], "handle() (app.helphandler method)": [[0, "app.HelpHandler.handle"]], "handle() (app.launchrequesthandler method)": [[0, "app.LaunchRequestHandler.handle"]], "handle() (app.navisonicplayalbumbyartist method)": [[0, "app.NaviSonicPlayAlbumByArtist.handle"]], "handle() (app.navisonicplayfavouritesongs method)": [[0, "app.NaviSonicPlayFavouriteSongs.handle"]], "handle() (app.navisonicplaymusicbyartist method)": [[0, "app.NaviSonicPlayMusicByArtist.handle"]], "handle() (app.navisonicplaymusicbygenre method)": [[0, "app.NaviSonicPlayMusicByGenre.handle"]], "handle() (app.navisonicplaymusicrandom method)": [[0, "app.NaviSonicPlayMusicRandom.handle"]], "handle() (app.navisonicplayplaylist method)": [[0, "app.NaviSonicPlayPlaylist.handle"]], "handle() (app.navisonicplaysongbyartist method)": [[0, "app.NaviSonicPlaySongByArtist.handle"]], "handle() (app.navisonicsongdetails method)": [[0, "app.NaviSonicSongDetails.handle"]], "handle() (app.navisonicstarsong method)": [[0, "app.NaviSonicStarSong.handle"]], "handle() (app.navisonicunstarsong method)": [[0, "app.NaviSonicUnstarSong.handle"]], "handle() (app.nextplaybackhandler method)": [[0, "app.NextPlaybackHandler.handle"]], "handle() (app.pauseplaybackhandler method)": [[0, "app.PausePlaybackHandler.handle"]], "handle() (app.playbackfailedeventhandler method)": [[0, "app.PlaybackFailedEventHandler.handle"]], "handle() (app.playbackfinishedhandler method)": [[0, "app.PlaybackFinishedHandler.handle"]], "handle() (app.playbacknearlyfinishedhandler method)": [[0, "app.PlaybackNearlyFinishedHandler.handle"]], "handle() (app.playbackstartedhandler method)": [[0, "app.PlaybackStartedHandler.handle"]], "handle() (app.playbackstoppedhandler method)": [[0, "app.PlaybackStoppedHandler.handle"]], "handle() (app.previousplaybackhandler method)": [[0, "app.PreviousPlaybackHandler.handle"]], "handle() (app.resumeplaybackhandler method)": [[0, "app.ResumePlaybackHandler.handle"]], "handle() (app.skilleventhandler method)": [[0, "app.SkillEventHandler.handle"]], "handle() (app.systemexceptionhandler method)": [[0, "app.SystemExceptionHandler.handle"]], "history (asknavidrome.media_queue.mediaqueue attribute)": [[0, "asknavidrome.media_queue.MediaQueue.history"]], "logger (asknavidrome.media_queue.mediaqueue attribute)": [[0, "asknavidrome.media_queue.MediaQueue.logger"]], "module": [[0, "module-app"], [0, "module-asknavidrome.controller"]], "ping() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.ping"]], "process() (app.loggingrequestinterceptor method)": [[0, "app.LoggingRequestInterceptor.process"]], "process() (app.loggingresponseinterceptor method)": [[0, "app.LoggingResponseInterceptor.process"]], "queue (asknavidrome.media_queue.mediaqueue attribute)": [[0, "asknavidrome.media_queue.MediaQueue.queue"]], "search_album() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.search_album"]], "search_artist() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.search_artist"]], "search_playlist() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.search_playlist"]], "search_song() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.search_song"]], "shuffle() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.shuffle"]], "star_entry() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.star_entry"]], "start_playback() (in module asknavidrome.controller)": [[0, "asknavidrome.controller.start_playback"]], "stop() (in module asknavidrome.controller)": [[0, "asknavidrome.controller.stop"]], "sync() (asknavidrome.media_queue.mediaqueue method)": [[0, "asknavidrome.media_queue.MediaQueue.sync"]], "unstar_entry() (asknavidrome.subsonic_api.subsonicconnection method)": [[0, "asknavidrome.subsonic_api.SubsonicConnection.unstar_entry"]], "view_buffer() (in module app)": [[0, "app.view_buffer"]], "view_history() (in module app)": [[0, "app.view_history"]], "view_queue() (in module app)": [[0, "app.view_queue"]]}}) \ No newline at end of file