get new docs uploaded to finish later

This commit is contained in:
cloudwithax 2023-02-28 11:16:58 -05:00
parent e0ff5f13a4
commit c7da354d68
55 changed files with 3600 additions and 14969 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 0ed884b921767abe79957ecf5d5887be
config: b8a410346a150a438a6445a71b9379ec
tags: 645f666f9bcd5a90fca523b33c5a78b7

View File

@ -1,112 +0,0 @@
.. pomice documentation master file, created by
sphinx-quickstart on Tue Nov 2 19:31:07 2021.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to Pomice!
==================
.. image:: https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg
The modern `Lavalink <https://github.com/freyacodes/Lavalink>`_ wrapper designed for `discord.py <https://github.com/Rapptz/discord.py>`_
Contents
---------
.. toctree::
modules
Before You Start
----------------
This library is designed to work with the Lavalink audio delivery system,
which directly interfaces with Discord to provide buttery smooth audio without
wasting your precious system resources.
Pomice is made with convenience to the user, in that everything is easy to use
and is out of your way, while also being customizable.
In order to start using this library, please download a Lavalink node to start,
you can get it `here <https://github.com/freyacodes/Lavalink/releases/latest>`_
Quick Jumpstart
----------------
If you want a quick example as to how to start with Pomice, look below:
.. code-block:: python3
import pomice
import discord
import re
from discord.ext import commands
URL_REG = re.compile(r'https?://(?:www\.)?.+')
class MyBot(commands.Bot):
def __init__(self) -> None:
super().__init__(command_prefix='!', activity=discord.Activity(type=discord.ActivityType.listening, name='to music!'))
self.add_cog(Music(self))
async def on_ready(self) -> None:
print("I'm online!")
await self.cogs["Music"].start_nodes()
class Music(commands.Cog):
def __init__(self, bot) -> None:
self.bot = bot
self.pomice = pomice.NodePool()
async def start_nodes(self):
await self.pomice.create_node(bot=self.bot, host='127.0.0.1', port='3030',
password='youshallnotpass', identifier='MAIN')
print(f"Node is ready!")
@commands.command(name='join', aliases=['connect'])
async def join(self, ctx: commands.Context, *, channel: discord.TextChannel = None) -> None:
if not channel:
channel = getattr(ctx.author.voice, 'channel', None)
if not channel:
raise commands.CheckFailure('You must be in a voice channel to use this command'
'without specifying the channel argument.')
await ctx.author.voice.channel.connect(cls=pomice.Player)
await ctx.send(f'Joined the voice channel `{channel}`')
@commands.command(name='play')
async def play(self, ctx, *, search: str) -> None:
if not ctx.voice_client:
await ctx.invoke(self.join)
player = ctx.voice_client
results = await player.get_tracks(query=f'{search}')
if not results:
raise commands.CommandError('No results were found for that search term.')
if isinstance(results, pomice.Playlist):
await player.play(track=results.tracks[0])
else:
await player.play(track=results[0])
bot = MyBot()
bot.run("token here")

View File

@ -1,4 +0,0 @@
.. toctree::
:maxdepth: 4
pomice

View File

@ -1,74 +0,0 @@
Pomice
==============
.. toctree::
:maxdepth: 4
pomice.spotify
Enums
-------------------
.. automodule:: pomice.enums
:members:
:undoc-members:
:show-inheritance:
Events
--------------------
.. automodule:: pomice.events
:members:
:undoc-members:
:show-inheritance:
Exceptions
------------------------
.. automodule:: pomice.exceptions
:members:
:undoc-members:
:show-inheritance:
Filters
---------------------
.. automodule:: pomice.filters
:members:
:undoc-members:
:show-inheritance:
Objects
---------------------
.. automodule:: pomice.objects
:members:
:undoc-members:
:show-inheritance:
Player
--------------------
.. automodule:: pomice.player
:members:
:undoc-members:
:show-inheritance:
Pool
------------------
.. automodule:: pomice.pool
:members:
:undoc-members:
:show-inheritance:
Utils
-------------------
.. automodule:: pomice.utils
:members:
:undoc-members:
:show-inheritance:

View File

@ -1,43 +0,0 @@
Spotify
======================
spotify.Album
---------------------------
.. automodule:: pomice.spotify.album
:members:
:undoc-members:
:show-inheritance:
spotify.Client
----------------------------
.. automodule:: pomice.spotify.client
:members:
:undoc-members:
:show-inheritance:
spotify.Exceptions
--------------------------------
.. automodule:: pomice.spotify.exceptions
:members:
:undoc-members:
:show-inheritance:
spotify.Playlist
------------------------------
.. automodule:: pomice.spotify.playlist
:members:
:undoc-members:
:show-inheritance:
spotify.Track
---------------------------
.. automodule:: pomice.spotify.track
:members:
:undoc-members:
:show-inheritance:

View File

@ -1,701 +0,0 @@
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Georgia, serif;
font-size: 17px;
background-color: #fff;
color: #000;
margin: 0;
padding: 0;
}
div.document {
width: 940px;
margin: 30px auto 0 auto;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 220px;
}
div.sphinxsidebar {
width: 220px;
font-size: 14px;
line-height: 1.5;
}
hr {
border: 1px solid #B1B4B6;
}
div.body {
background-color: #fff;
color: #3E4349;
padding: 0 30px 0 30px;
}
div.body > .section {
text-align: left;
}
div.footer {
width: 940px;
margin: 20px auto 30px auto;
font-size: 14px;
color: #888;
text-align: right;
}
div.footer a {
color: #888;
}
p.caption {
font-family: inherit;
font-size: inherit;
}
div.relations {
display: none;
}
div.sphinxsidebar a {
color: #444;
text-decoration: none;
border-bottom: 1px dotted #999;
}
div.sphinxsidebar a:hover {
border-bottom: 1px solid #999;
}
div.sphinxsidebarwrapper {
padding: 18px 10px;
}
div.sphinxsidebarwrapper p.logo {
padding: 0;
margin: -10px 0 0 0px;
text-align: center;
}
div.sphinxsidebarwrapper h1.logo {
margin-top: -10px;
text-align: center;
margin-bottom: 5px;
text-align: left;
}
div.sphinxsidebarwrapper h1.logo-name {
margin-top: 0px;
}
div.sphinxsidebarwrapper p.blurb {
margin-top: 0;
font-style: normal;
}
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
font-family: Georgia, serif;
color: #444;
font-size: 24px;
font-weight: normal;
margin: 0 0 5px 0;
padding: 0;
}
div.sphinxsidebar h4 {
font-size: 20px;
}
div.sphinxsidebar h3 a {
color: #444;
}
div.sphinxsidebar p.logo a,
div.sphinxsidebar h3 a,
div.sphinxsidebar p.logo a:hover,
div.sphinxsidebar h3 a:hover {
border: none;
}
div.sphinxsidebar p {
color: #555;
margin: 10px 0;
}
div.sphinxsidebar ul {
margin: 10px 0;
padding: 0;
color: #000;
}
div.sphinxsidebar ul li.toctree-l1 > a {
font-size: 120%;
}
div.sphinxsidebar ul li.toctree-l2 > a {
font-size: 110%;
}
div.sphinxsidebar input {
border: 1px solid #CCC;
font-family: Georgia, serif;
font-size: 1em;
}
div.sphinxsidebar hr {
border: none;
height: 1px;
color: #AAA;
background: #AAA;
text-align: left;
margin-left: 0;
width: 50%;
}
div.sphinxsidebar .badge {
border-bottom: none;
}
div.sphinxsidebar .badge:hover {
border-bottom: none;
}
/* To address an issue with donation coming after search */
div.sphinxsidebar h3.donation {
margin-top: 10px;
}
/* -- body styles ----------------------------------------------------------- */
a {
color: #004B6B;
text-decoration: underline;
}
a:hover {
color: #6D4100;
text-decoration: underline;
}
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Georgia, serif;
font-weight: normal;
margin: 30px 0px 10px 0px;
padding: 0;
}
div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
div.body h2 { font-size: 180%; }
div.body h3 { font-size: 150%; }
div.body h4 { font-size: 130%; }
div.body h5 { font-size: 100%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #DDD;
padding: 0 4px;
text-decoration: none;
}
a.headerlink:hover {
color: #444;
background: #EAEAEA;
}
div.body p, div.body dd, div.body li {
line-height: 1.4em;
}
div.admonition {
margin: 20px 0px;
padding: 10px 30px;
background-color: #EEE;
border: 1px solid #CCC;
}
div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fafafa;
}
div.admonition p.admonition-title {
font-family: Georgia, serif;
font-weight: normal;
font-size: 24px;
margin: 0 0 10px 0;
padding: 0;
line-height: 1;
}
div.admonition p.last {
margin-bottom: 0;
}
div.highlight {
background-color: #fff;
}
dt:target, .highlight {
background: #FAF3E8;
}
div.warning {
background-color: #FCC;
border: 1px solid #FAA;
}
div.danger {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.error {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.caution {
background-color: #FCC;
border: 1px solid #FAA;
}
div.attention {
background-color: #FCC;
border: 1px solid #FAA;
}
div.important {
background-color: #EEE;
border: 1px solid #CCC;
}
div.note {
background-color: #EEE;
border: 1px solid #CCC;
}
div.tip {
background-color: #EEE;
border: 1px solid #CCC;
}
div.hint {
background-color: #EEE;
border: 1px solid #CCC;
}
div.seealso {
background-color: #EEE;
border: 1px solid #CCC;
}
div.topic {
background-color: #EEE;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre, tt, code {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-size: 0.9em;
}
.hll {
background-color: #FFC;
margin: 0 -12px;
padding: 0 12px;
display: block;
}
img.screenshot {
}
tt.descname, tt.descclassname, code.descname, code.descclassname {
font-size: 0.95em;
}
tt.descname, code.descname {
padding-right: 0.08em;
}
img.screenshot {
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils {
border: 1px solid #888;
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils td, table.docutils th {
border: 1px solid #888;
padding: 0.25em 0.7em;
}
table.field-list, table.footnote {
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
table.footnote {
margin: 15px 0;
width: 100%;
border: 1px solid #EEE;
background: #FDFDFD;
font-size: 0.9em;
}
table.footnote + table.footnote {
margin-top: -15px;
border-top: none;
}
table.field-list th {
padding: 0 0.8em 0 0;
}
table.field-list td {
padding: 0;
}
table.field-list p {
margin-bottom: 0.8em;
}
/* Cloned from
* https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
*/
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
table.footnote td.label {
width: .1px;
padding: 0.3em 0 0.3em 0.5em;
}
table.footnote td {
padding: 0.3em 0.5em;
}
dl {
margin: 0;
padding: 0;
}
dl dd {
margin-left: 30px;
}
blockquote {
margin: 0 0 0 30px;
padding: 0;
}
ul, ol {
/* Matches the 30px from the narrow-screen "li > ul" selector below */
margin: 10px 0 10px 30px;
padding: 0;
}
pre {
background: #EEE;
padding: 7px 30px;
margin: 15px 0px;
line-height: 1.3em;
}
div.viewcode-block:target {
background: #ffd;
}
dl pre, blockquote pre, li pre {
margin-left: 0;
padding-left: 30px;
}
tt, code {
background-color: #ecf0f3;
color: #222;
/* padding: 1px 2px; */
}
tt.xref, code.xref, a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fff;
}
a.reference {
text-decoration: none;
border-bottom: 1px dotted #004B6B;
}
/* Don't put an underline on images */
a.image-reference, a.image-reference:hover {
border-bottom: none;
}
a.reference:hover {
border-bottom: 1px solid #6D4100;
}
a.footnote-reference {
text-decoration: none;
font-size: 0.7em;
vertical-align: top;
border-bottom: 1px dotted #004B6B;
}
a.footnote-reference:hover {
border-bottom: 1px solid #6D4100;
}
a:hover tt, a:hover code {
background: #EEE;
}
@media screen and (max-width: 870px) {
div.sphinxsidebar {
display: none;
}
div.document {
width: 100%;
}
div.documentwrapper {
margin-left: 0;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
}
div.bodywrapper {
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
}
ul {
margin-left: 0;
}
li > ul {
/* Matches the 30px from the "ul, ol" selector above */
margin-left: 30px;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.bodywrapper {
margin: 0;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
@media screen and (max-width: 875px) {
body {
margin: 0;
padding: 20px 30px;
}
div.documentwrapper {
float: none;
background: #fff;
}
div.sphinxsidebar {
display: block;
float: none;
width: 102.5%;
margin: 50px -30px -20px -30px;
padding: 10px 20px;
background: #333;
color: #FFF;
}
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #fff;
}
div.sphinxsidebar a {
color: #AAA;
}
div.sphinxsidebar p.logo {
display: none;
}
div.document {
width: 100%;
margin: 0;
}
div.footer {
display: none;
}
div.bodywrapper {
margin: 0;
}
div.body {
min-height: 0;
padding: 0;
}
.rtd_doc_footer {
display: none;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
/* misc. */
.revsys-inline {
display: none!important;
}
/* Make nested-list/multi-paragraph items look better in Releases changelog
* pages. Without this, docutils' magical list fuckery causes inconsistent
* formatting between different release sub-lists.
*/
div#changelog > div.section > ul > li > p:only-child {
margin-bottom: 0;
}
/* Hide fugly table cell borders in ..bibliography:: directive output */
table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
border: none;
/* Below needed in some edge cases; if not applied, bottom shadows appear */
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
/* relbar */
.related {
line-height: 30px;
width: 100%;
font-size: 0.9rem;
}
.related.top {
border-bottom: 1px solid #EEE;
margin-bottom: 20px;
}
.related.bottom {
border-top: 1px solid #EEE;
}
.related ul {
padding: 0;
margin: 0;
list-style: none;
}
.related li {
display: inline;
}
nav#rellinks {
float: right;
}
nav#rellinks li+li:before {
content: "|";
}
nav#breadcrumbs li+li:before {
content: "\00BB";
}
/* Hide certain items when printing */
@media print {
div.related {
display: none;
}
}

View File

@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@ -222,7 +222,7 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
min-width: 360px;
max-width: 800px;
}
@ -237,16 +237,6 @@ a.headerlink {
visibility: hidden;
}
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
@ -334,13 +324,15 @@ aside.sidebar {
p.sidebar-title {
font-weight: bold;
}
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic {
border: 1px solid #ccc;
padding: 7px;
@ -379,6 +371,8 @@ div.body p.centered {
div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
@ -386,6 +380,8 @@ div.admonition > :last-child {
div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
@ -428,10 +424,6 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
@ -614,20 +606,26 @@ ol.simple p,
ul.simple p {
margin-bottom: 0;
}
dl.footnote > dt,
dl.citation > dt {
aside.footnote > span,
div.citation > span {
float: left;
margin-right: 0.5em;
}
dl.footnote > dd,
dl.citation > dd {
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
dl.footnote > dd:after,
dl.citation > dd:after {
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
@ -644,10 +642,6 @@ dl.field-list > dt {
padding-right: 5px;
}
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
@ -731,8 +725,9 @@ dl.glossary dt {
.classifier:before {
font-style: normal;
margin: 0.5em;
margin: 0 0.5em;
content: ":";
display: inline-block;
}
abbr, acronym {
@ -756,6 +751,7 @@ span.pre {
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
white-space: nowrap;
}
div[class*="highlight-"] {

View File

@ -1 +0,0 @@
/* This file intentionally left blank. */

View File

@ -2,322 +2,155 @@
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
* Base JavaScript utilities for all Sphinx HTML documentation.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
"use strict";
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
"TEXTAREA",
"INPUT",
"SELECT",
"BUTTON",
]);
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
} else {
span = document.createElement("span");
span.className = className;
document.addEventListener("DOMContentLoaded", callback);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.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": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
this.initOnKeyListeners();
}
const Documentation = {
init: () => {
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
/**
* i18n support
*/
TRANSLATIONS: {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE : 'unknown',
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined')
return string;
return (typeof translated === 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
gettext: (string) => {
const translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) {
case "undefined":
return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
ngettext: (singular, plural, n) => {
const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined")
return translated[Documentation.PLURAL_EXPR(n)];
return n === 1 ? singular : plural;
},
addTranslations: (catalog) => {
Object.assign(Documentation.TRANSLATIONS, catalog.messages);
Documentation.PLURAL_EXPR = new Function(
"n",
`return (${catalog.plural_expr})`
);
Documentation.LOCALE = catalog.locale;
},
/**
* helper function to hide the search marks again
* helper function to focus on search bar
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
focusSearchBar: () => {
document.querySelectorAll("input[name=q]")[0]?.focus();
},
/**
* make the url absolute
* Initialise the domain index toggle buttons
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
$(document).keydown(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box, textarea, dropdown or button
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
&& activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
&& !event.shiftKey) {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
}
break;
case 39: // right
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
break;
}
}
});
initDomainIndexTable: () => {
const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
// quick alias for translations
_ = Documentation.gettext;
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
$(document).ready(function() {
Documentation.init();
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!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.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
});
},
};
// quick alias for translations
const _ = Documentation.gettext;
_ready(Documentation.init);

View File

@ -1,12 +1,14 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '1.1.1',
LANGUAGE: 'None',
VERSION: '2.1.1',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false
NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@ -197,101 +197,3 @@ var Stemmer = function() {
}
}
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}

View File

@ -1,22 +1,22 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight pre { line-height: 125%; }
.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #8f5902; font-style: italic } /* Comment */
.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
.highlight .g { color: #000000 } /* Generic */
.highlight .k { color: #004461; font-weight: bold } /* Keyword */
.highlight .k { color: #204a87; font-weight: bold } /* Keyword */
.highlight .l { color: #000000 } /* Literal */
.highlight .n { color: #000000 } /* Name */
.highlight .o { color: #582800 } /* Operator */
.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */
.highlight .x { color: #000000 } /* Other */
.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #8f5902 } /* Comment.Preproc */
.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */
.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
@ -25,25 +25,25 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .gr { color: #ef2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #745334 } /* Generic.Prompt */
.highlight .go { color: #000000; font-style: italic } /* Generic.Output */
.highlight .gp { color: #8f5902 } /* Generic.Prompt */
.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */
.highlight .ld { color: #000000 } /* Literal.Date */
.highlight .m { color: #990000 } /* Literal.Number */
.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */
.highlight .s { color: #4e9a06 } /* Literal.String */
.highlight .na { color: #c4a000 } /* Name.Attribute */
.highlight .nb { color: #004461 } /* Name.Builtin */
.highlight .nb { color: #204a87 } /* Name.Builtin */
.highlight .nc { color: #000000 } /* Name.Class */
.highlight .no { color: #000000 } /* Name.Constant */
.highlight .nd { color: #888888 } /* Name.Decorator */
.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #ce5c00 } /* Name.Entity */
.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #000000 } /* Name.Function */
@ -51,15 +51,16 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .nn { color: #000000 } /* Name.Namespace */
.highlight .nx { color: #000000 } /* Name.Other */
.highlight .py { color: #000000 } /* Name.Property */
.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #000000 } /* Name.Variable */
.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
.highlight .mb { color: #990000 } /* Literal.Number.Bin */
.highlight .mf { color: #990000 } /* Literal.Number.Float */
.highlight .mh { color: #990000 } /* Literal.Number.Hex */
.highlight .mi { color: #990000 } /* Literal.Number.Integer */
.highlight .mo { color: #990000 } /* Literal.Number.Oct */
.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */
.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
.highlight .w { color: #f8f8f8 } /* Text.Whitespace */
.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
@ -79,4 +80,176 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .vg { color: #000000 } /* Name.Variable.Global */
.highlight .vi { color: #000000 } /* Name.Variable.Instance */
.highlight .vm { color: #000000 } /* Name.Variable.Magic */
.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */
.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */
@media not print {
body[data-theme="dark"] .highlight pre { line-height: 125%; }
body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight .hll { background-color: #404040 }
body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 }
body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */
body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */
body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */
body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */
body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */
body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */
body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */
body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */
body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
body[data-theme="dark"] .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */
body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */
body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */
body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */
body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */
body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */
body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */
body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */
body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */
body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */
body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */
body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */
body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */
body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */
body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */
body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */
body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */
body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */
body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */
body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */
body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */
body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */
body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */
body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) .highlight pre { line-height: 125%; }
body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight .hll { background-color: #404040 }
body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 }
body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */
body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */
body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */
body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */
body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */
body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */
body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */
body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */
body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
body:not([data-theme="light"]) .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */
body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */
body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */
body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */
body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */
body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */
body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */
body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */
body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */
body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */
body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */
body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */
body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */
body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */
body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */
body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */
body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */
body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */
body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */
body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */
body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */
body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */
body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */
body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
}
}

View File

@ -4,22 +4,24 @@
*
* Sphinx JavaScript utilities for the full-text search.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
"use strict";
if (!Scorer) {
/**
* Simple result scoring code.
*/
if (typeof Scorer === "undefined") {
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score]
// The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score.
/*
score: function(result) {
return result[4];
score: result => {
const [docname, title, anchor, descr, score, filename] = result
return score
},
*/
@ -28,9 +30,11 @@ if (!Scorer) {
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults
objPrio: {
0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5}, // used to be unimportantResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping.
objPrioDefault: 0,
@ -39,455 +43,495 @@ if (!Scorer) {
partialTitle: 7,
// query found in terms
term: 5,
partialTerm: 2
partialTerm: 2,
};
}
if (!splitQuery) {
function splitQuery(query) {
return query.split(/\s+/);
const _removeChildren = (element) => {
while (element && element.lastChild) element.removeChild(element.lastChild);
};
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
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, score, _filename] = item;
let listItem = document.createElement("li");
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = docUrlRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = docUrlRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
}
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + anchor;
linkEl.dataset.score = score;
linkEl.innerHTML = title;
if (descr)
listItem.appendChild(document.createElement("span")).innerHTML =
" (" + descr + ")";
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms)
);
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = _(
`Search finished, found ${resultCount} page(s) matching the search query.`
);
};
const _displayNextItem = (
results,
resultCount,
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(), searchTerms);
setTimeout(
() => _displayNextItem(results, resultCount, searchTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
}
/**
* Search Module
*/
var Search = {
const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
htmlToText : function(htmlString) {
var virtualDocument = document.implementation.createHTMLDocument('virtual');
var htmlElement = $(htmlString, virtualDocument);
htmlElement.find('.headerlink').remove();
docContent = htmlElement.find('[role=main]')[0];
if(docContent === undefined) {
console.warn("Content block not found. Sphinx search tries to obtain it " +
"via '[role=main]'. Could you check your theme or template.");
htmlToText: (htmlString) => {
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
const docContent = htmlElement.querySelector('[role="main"]');
if (docContent !== undefined) return docContent.textContent;
console.warn(
"Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
);
return "";
}
return docContent.textContent || docContent.innerText;
},
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
init: () => {
const query = new URLSearchParams(window.location.search).get("q");
document
.querySelectorAll('input[name="q"]')
.forEach((el) => (el.value = query));
if (query) Search.performSearch(query);
},
loadIndex: (url) =>
(document.body.appendChild(document.createElement("script")).src = url),
setIndex: (index) => {
Search._index = index;
if (Search._queued_query !== null) {
const query = Search._queued_query;
Search._queued_query = null;
Search.query(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
hasIndex: () => Search._index !== null,
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
deferQuery: (query) => (Search._queued_query = query),
hasIndex : function() {
return this._index !== null;
},
stopPulse: () => (Search._pulse_status = -1),
deferQuery : function(query) {
this._queued_query = query;
},
startPulse: () => {
if (Search._pulse_status >= 0) return;
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
const pulse = () => {
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
Search.dots.innerText = ".".repeat(Search._pulse_status);
if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch : function(query) {
performSearch: (query) => {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
const searchText = document.createElement("h2");
searchText.textContent = _("Searching");
const searchSummary = document.createElement("p");
searchSummary.classList.add("search-summary");
searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.classList.add("search");
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
const out = document.getElementById("search-results");
Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
if (Search.hasIndex()) Search.query(query);
else Search.deferQuery(query);
},
/**
* execute search (requires search index to be loaded)
*/
query : function(query) {
var i;
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
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = splitQuery(query);
var objectterms = [];
for (i = 0; i < tmp.length; i++) {
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase());
}
const stemmer = new Stemmer();
const searchTerms = new Set();
const excludedTerms = new Set();
const highlightTerms = new Set();
const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
splitQuery(query.trim()).forEach((queryTerm) => {
const queryTermLower = queryTerm.toLowerCase();
// maybe skip this "word"
// stopwords array is from language_data.js
if (
stopwords.indexOf(queryTermLower) !== -1 ||
queryTerm.match(/^\d+$/)
)
return;
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase());
// prevent stemmer from cutting word smaller than two chars
if(word.length < 3 && tmp[i].length >= 3) {
word = tmp[i];
}
var toAppend;
let word = stemmer.stemWord(queryTermLower);
// select the correct list
if (word[0] == '-') {
toAppend = excluded;
word = word.substr(1);
}
if (word[0] === "-") excludedTerms.add(word.substr(1));
else {
toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
searchTerms.add(word);
highlightTerms.add(queryTermLower);
}
// only add if not already in the list
if (!$u.contains(toAppend, word))
toAppend.push(word);
});
if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
}
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// console.debug("SEARCH: searching for:");
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
// prepare search
var terms = this._index.terms;
var titleterms = this._index.titleterms;
// array of [docname, title, anchor, descr, score, filename]
let results = [];
_removeChildren(document.getElementById("search-progress"));
// array of [filename, title, anchor, descr, score]
var results = [];
$('#search-progress').empty();
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
for (i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0, i),
objectterms.slice(i+1, objectterms.length));
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
objectTerms.forEach((term) =>
results.push(...Search.performObjectSearch(term, objectTerms))
);
// lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
// now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then
// alphabetically
results.sort(function(a, b) {
var left = a[4];
var right = b[4];
if (left > right) {
return 1;
} else if (left < right) {
return -1;
} else {
results.sort((a, b) => {
const leftScore = a[4];
const rightScore = b[4];
if (leftScore === rightScore) {
// same score: sort alphabetically
left = a[1].toLowerCase();
right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
const leftTitle = a[1].toLowerCase();
const rightTitle = b[1].toLowerCase();
if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
}
return leftScore > rightScore ? 1 : -1;
});
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
results = results.reverse();
// for debugging
//Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults);
// console.info("search results:", Search.lastresults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li></li>');
var requestUrl = "";
var linkUrl = "";
if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
}
listItem.append($('<a/>').attr('href',
linkUrl +
highlightstring + item[2]).html(item[1]));
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.ajax({url: requestUrl,
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
var summary = Search.makeSearchSummary(data, searchterms, hlterms);
if (summary) {
listItem.append(summary);
}
}
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}});
} else {
// no source available, just display title
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
_displayNextItem(results, results.length, searchTerms);
},
/**
* search for object names
*/
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var docnames = this._index.docnames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
performObjectSearch: (object, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const objects = Search._index.objects;
const objNames = Search._index.objnames;
const titles = Search._index.titles;
var i;
var results = [];
const results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4]
const fullname = (prefix ? prefix + "." : "") + name;
const fullnameLower = fullname.toLowerCase();
if (fullnameLower.indexOf(object) < 0) return;
let score = 0;
const parts = fullnameLower.split(".");
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
var fullnameLower = fullname.toLowerCase()
if (fullnameLower.indexOf(object) > -1) {
var score = 0;
var parts = fullnameLower.split('.');
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullnameLower == object || parts[parts.length - 1] == object) {
if (fullnameLower === object || parts.slice(-1)[0] === object)
score += Scorer.objNameMatch;
// matches in last name
} else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch;
}
var match = objects[prefix][name];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
else if (parts.slice(-1)[0].indexOf(object) > -1)
score += Scorer.objPartialMatch; // matches in last name
const objName = objNames[match[1]][2];
const title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
const otherTerms = new Set(objectTerms);
otherTerms.delete(object);
if (otherTerms.size > 0) {
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
if (
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
)
return;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3];
if (anchor === '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) {
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
} else {
score += Scorer.objPrioDefault;
}
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
}
}
}
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results;
},
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
*/
escapeRegExp : function(string) {
return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
},
/**
* search for full-text terms in the index
*/
performTermsSearch : function(searchterms, excluded, terms, titleterms) {
var docnames = this._index.docnames;
var filenames = this._index.filenames;
var titles = this._index.titles;
performTermsSearch: (searchTerms, excludedTerms) => {
// prepare search
const terms = Search._index.terms;
const titleTerms = Search._index.titleterms;
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
var i, j, file;
var fileMap = {};
var scoreMap = {};
var results = [];
const scoreMap = new Map();
const fileMap = new Map();
// perform the search on the required terms
for (i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
var files = [];
var _o = [
searchTerms.forEach((word) => {
const files = [];
const arr = [
{ files: terms[word], score: Scorer.term },
{files: titleterms[word], score: Scorer.title}
{ files: titleTerms[word], score: Scorer.title },
];
// add support for partial matches
if (word.length > 2) {
var word_regex = this.escapeRegExp(word);
for (var w in terms) {
if (w.match(word_regex) && !terms[word]) {
_o.push({files: terms[w], score: Scorer.partialTerm})
}
}
for (var w in titleterms) {
if (w.match(word_regex) && !titleterms[word]) {
_o.push({files: titleterms[w], score: Scorer.partialTitle})
}
}
const escapedWord = _escapeRegExp(word);
Object.keys(terms).forEach((term) => {
if (term.match(escapedWord) && !terms[word])
arr.push({ files: terms[term], score: Scorer.partialTerm });
});
Object.keys(titleTerms).forEach((term) => {
if (term.match(escapedWord) && !titleTerms[word])
arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
});
}
// no match but word was a required one
if ($u.every(_o, function(o){return o.files === undefined;})) {
break;
}
if (arr.every((record) => record.files === undefined)) return;
// found search word in contents
$u.each(_o, function(o) {
var _files = o.files;
if (_files === undefined)
return
arr.forEach((record) => {
if (record.files === undefined) return;
if (_files.length === undefined)
_files = [_files];
files = files.concat(_files);
let recordFiles = record.files;
if (recordFiles.length === undefined) recordFiles = [recordFiles];
files.push(...recordFiles);
// set score for the word in each file to Scorer.term
for (j = 0; j < _files.length; j++) {
file = _files[j];
if (!(file in scoreMap))
scoreMap[file] = {};
scoreMap[file][word] = o.score;
}
// set score for the word in each file
recordFiles.forEach((file) => {
if (!scoreMap.has(file)) scoreMap.set(file, {});
scoreMap.get(file)[word] = record.score;
});
});
// create the mapping
for (j = 0; j < files.length; j++) {
file = files[j];
if (file in fileMap && fileMap[file].indexOf(word) === -1)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
files.forEach((file) => {
if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
fileMap.get(file).push(word);
else fileMap.set(file, [word]);
});
});
// now check if the files don't contain excluded terms
for (file in fileMap) {
var valid = true;
const results = [];
for (const [file, wordList] of fileMap) {
// check if all requirements are matched
var filteredTermCount = // as search terms with length < 3 are discarded: ignore
searchterms.filter(function(term){return term.length > 2}).length
// as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2
).length;
if (
fileMap[file].length != searchterms.length &&
fileMap[file].length != filteredTermCount
) continue;
wordList.length !== searchTerms.size &&
wordList.length !== filteredTermCount
)
continue;
// ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
titleterms[excluded[i]] == file ||
$u.contains(terms[excluded[i]] || [], file) ||
$u.contains(titleterms[excluded[i]] || [], file)) {
valid = false;
if (
[...excludedTerms].some(
(term) =>
terms[term] === file ||
titleTerms[term] === file ||
(terms[term] || []).includes(file) ||
(titleTerms[term] || []).includes(file)
)
)
break;
}
}
// if we have still a valid result we can add it to the result list
if (valid) {
// select one (max) score for the file.
// for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
}
const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
// add result to the result list
results.push([
docNames[file],
titles[file],
"",
null,
score,
filenames[file],
]);
}
return results;
},
@ -495,34 +539,28 @@ var Search = {
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords 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 : function(htmlText, keywords, hlwords) {
var text = Search.htmlToText(htmlText);
if (text == "") {
return null;
}
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<p class="context"></p>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
makeSearchSummary: (htmlText, keywords) => {
const text = Search.htmlToText(htmlText);
if (text === "") return null;
const textLower = text.toLowerCase();
const actualStartPosition = [...keywords]
.map((k) => textLower.indexOf(k.toLowerCase()))
.filter((i) => i > -1)
.slice(-1)[0];
const startWithContext = Math.max(actualStartPosition - 120, 0);
const top = startWithContext === 0 ? "" : "...";
const tail = startWithContext + 240 < text.length ? "..." : "";
let summary = document.createElement("p");
summary.classList.add("context");
summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
return summary;
},
};
$(document).ready(function() {
Search.init();
});
_ready(Search.init);

File diff suppressed because it is too large Load Diff

View File

@ -1,218 +1,307 @@
<!doctype html>
<html class="no-js" lang="en">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Installation" href="installation.html" />
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>Welcome to Pomice! &#8212; Pomice 1.1.1 documentation</title>
<!-- Generated with Sphinx 5.3.0 and Furo 2022.12.07 -->
<title>Pomice</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=91d0f0d1c444bdcb17a68e833c7a53903343c195" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<style>
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-half" viewBox="0 0 24 24">
<title>Auto light/dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="12" r="9" />
<path d="M13 12h5" />
<path d="M13 15h4" />
<path d="M13 18h1" />
<path d="M13 9h4" />
<path d="M13 6h1" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
<div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
<div class="visually-hidden">Hide table of contents sidebar</div>
</label>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<div class="visually-hidden">Toggle site navigation sidebar</div>
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
</div>
<div class="header-center">
<a href="#"><div class="brand">Pomice</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="#">
<span class="sidebar-brand-text">Pomice</span>
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Before You Start</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quick Jumpstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="faq.html">Frequently Asked Questions</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">How Do I?</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="hdi/index.html">How Do I?</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="hdi/pool.html">Use the NodePool class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/node.html">Use the Node class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/player.html">Use the Player class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/filters.html">Use the Filter class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/queue.html">Use the Queue class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/events.html">Use the Events class</a></li>
</ul>
</li>
</ul>
<p class="caption" role="heading"><span class="caption-text">API Reference</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="api/index.html">API Reference</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="api/enums.html">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/events.html">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/exceptions.html">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/filters.html">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/objects.html">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/player.html">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/pool.html">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/queue.html">Queue</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/utils.html">Utils</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="edit-this-page">
<a class="muted-link" href="https://github.com/cloudwithax/pomice/edit/main/docs/index.md" title="Edit this page">
<svg aria-hidden="true" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 20h4l10.5 -10.5a1.5 1.5 0 0 0 -4 -4l-10.5 10.5v4" />
<line x1="13.5" y1="6.5" x2="17.5" y2="10.5" />
</svg>
<span class="visually-hidden">Edit this page</span>
</a>
</div><div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
<article role="main">
<section class="tex2jax_ignore mathjax_ignore" id="pomice">
<h1>Pomice<a class="headerlink" href="#pomice" title="Permalink to this heading">#</a></h1>
<p><img alt="" src="https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg" /></p>
<p>Pomice is a fully asynchronous Python library designed for communicating with <a class="reference external" href="https://github.com/freyacodes/Lavalink">Lavalink</a> seamlessly within the <a class="reference external" href="https://github.com/Rapptz/discord.py">discord.py</a> library. It features 100% API coverage of the entire <a class="reference external" href="https://github.com/freyacodes/Lavalink">Lavalink</a> spec that can be accessed with easy-to-understand functions. We also include Spotify and Apple Music querying capabilites using built-in custom clients, making it easier to develop your next big music bot.</p>
<section id="quick-links">
<h2>Quick Links:<a class="headerlink" href="#quick-links" title="Permalink to this heading">#</a></h2>
<ul class="simple">
<li><p><a class="reference internal" href="installation.html"><span class="doc std std-doc">Installation</span></a></p></li>
<li><p><a class="reference internal" href="quickstart.html"><span class="doc std std-doc">Quickstart</span></a></p></li>
<li><p><a class="reference internal" href="faq.html"><span class="doc std std-doc">Frequently Asked Questions</span></a></p></li>
<li><p><a class="reference internal" href="hdi/index.html"><span class="doc std std-doc">How Do I?</span></a></p></li>
<li><p><a class="reference internal" href="api/index.html"><span class="doc std std-doc">API Reference</span></a></p></li>
</ul>
<div class="toctree-wrapper compound">
</div>
<div class="toctree-wrapper compound">
</div>
<div class="toctree-wrapper compound">
</div>
</section>
</section>
</article>
</div>
<footer>
<div class="related-pages">
<a class="next-page" href="installation.html">
<div class="page-info">
<div class="context">
<span>Next</span>
</div>
<div class="title">Installation</div>
</div>
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
</a>
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2023, cloudwithax
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
<div class="icons">
<a class="muted-link " href="https://github.com/cloudwithax/pomice" aria-label="GitHub">
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path>
</svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="&lt;no title&gt;" href="modules.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="welcome-to-pomice">
<h1>Welcome to Pomice!<a class="headerlink" href="#welcome-to-pomice" title="Permalink to this headline"></a></h1>
<img alt="https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg" src="https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg" />
<p>The modern <a class="reference external" href="https://github.com/freyacodes/Lavalink">Lavalink</a> wrapper designed for <a class="reference external" href="https://github.com/Rapptz/discord.py">discord.py</a></p>
<section id="contents">
<h2>Contents<a class="headerlink" href="#contents" title="Permalink to this headline"></a></h2>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.html">Pomice</a><ul>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html">Spotify</a><ul>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.album">spotify.Album</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.client">spotify.Client</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.exceptions">spotify.Exceptions</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.playlist">spotify.Playlist</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.track">spotify.Track</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.enums">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.events">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.exceptions">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.filters">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.objects">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.player">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.pool">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.utils">Utils</a></li>
</ul>
</li>
</ul>
</div>
</section>
<section id="before-you-start">
<h2>Before You Start<a class="headerlink" href="#before-you-start" title="Permalink to this headline"></a></h2>
<p>This library is designed to work with the Lavalink audio delivery system,
which directly interfaces with Discord to provide buttery smooth audio without
wasting your precious system resources.</p>
<p>Pomice is made with convenience to the user, in that everything is easy to use
and is out of your way, while also being customizable.</p>
<p>In order to start using this library, please download a Lavalink node to start,
you can get it <a class="reference external" href="https://github.com/freyacodes/Lavalink/releases/latest">here</a></p>
</section>
<section id="quick-jumpstart">
<h2>Quick Jumpstart<a class="headerlink" href="#quick-jumpstart" title="Permalink to this headline"></a></h2>
<p>If you want a quick example as to how to start with Pomice, look below:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pomice</span>
<span class="kn">import</span> <span class="nn">discord</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">commands</span>
<span class="n">URL_REG</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;https?://(?:www\.)?.+&#39;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">MyBot</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">Bot</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">command_prefix</span><span class="o">=</span><span class="s1">&#39;!&#39;</span><span class="p">,</span> <span class="n">activity</span><span class="o">=</span><span class="n">discord</span><span class="o">.</span><span class="n">Activity</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="n">discord</span><span class="o">.</span><span class="n">ActivityType</span><span class="o">.</span><span class="n">listening</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;to music!&#39;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_cog</span><span class="p">(</span><span class="n">Music</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">on_ready</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;I&#39;m online!&quot;</span><span class="p">)</span>
<span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">cogs</span><span class="p">[</span><span class="s2">&quot;Music&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">start_nodes</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Music</span><span class="p">(</span><span class="n">commands</span><span class="o">.</span><span class="n">Cog</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bot</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bot</span> <span class="o">=</span> <span class="n">bot</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pomice</span> <span class="o">=</span> <span class="n">pomice</span><span class="o">.</span><span class="n">NodePool</span><span class="p">()</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">start_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">pomice</span><span class="o">.</span><span class="n">create_node</span><span class="p">(</span><span class="n">bot</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">bot</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="s1">&#39;127.0.0.1&#39;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="s1">&#39;3030&#39;</span><span class="p">,</span>
<span class="n">password</span><span class="o">=</span><span class="s1">&#39;youshallnotpass&#39;</span><span class="p">,</span> <span class="n">identifier</span><span class="o">=</span><span class="s1">&#39;MAIN&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Node is ready!&quot;</span><span class="p">)</span>
<span class="nd">@commands</span><span class="o">.</span><span class="n">command</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;join&#39;</span><span class="p">,</span> <span class="n">aliases</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;connect&#39;</span><span class="p">])</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">join</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">:</span> <span class="n">commands</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">channel</span><span class="p">:</span> <span class="n">discord</span><span class="o">.</span><span class="n">TextChannel</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">channel</span><span class="p">:</span>
<span class="n">channel</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">voice</span><span class="p">,</span> <span class="s1">&#39;channel&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">channel</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">commands</span><span class="o">.</span><span class="n">CheckFailure</span><span class="p">(</span><span class="s1">&#39;You must be in a voice channel to use this command&#39;</span>
<span class="s1">&#39;without specifying the channel argument.&#39;</span><span class="p">)</span>
<span class="k">await</span> <span class="n">ctx</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">voice</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">cls</span><span class="o">=</span><span class="n">pomice</span><span class="o">.</span><span class="n">Player</span><span class="p">)</span>
<span class="k">await</span> <span class="n">ctx</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Joined the voice channel `</span><span class="si">{</span><span class="n">channel</span><span class="si">}</span><span class="s1">`&#39;</span><span class="p">)</span>
<span class="nd">@commands</span><span class="o">.</span><span class="n">command</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;play&#39;</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">play</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">search</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ctx</span><span class="o">.</span><span class="n">voice_client</span><span class="p">:</span>
<span class="k">await</span> <span class="n">ctx</span><span class="o">.</span><span class="n">invoke</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">join</span><span class="p">)</span>
<span class="n">player</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">voice_client</span>
<span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">player</span><span class="o">.</span><span class="n">get_tracks</span><span class="p">(</span><span class="n">query</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">search</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">results</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">commands</span><span class="o">.</span><span class="n">CommandError</span><span class="p">(</span><span class="s1">&#39;No results were found for that search term.&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">pomice</span><span class="o">.</span><span class="n">Playlist</span><span class="p">):</span>
<span class="k">await</span> <span class="n">player</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">track</span><span class="o">=</span><span class="n">results</span><span class="o">.</span><span class="n">tracks</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">await</span> <span class="n">player</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">track</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">bot</span> <span class="o">=</span> <span class="n">MyBot</span><span class="p">()</span>
<span class="n">bot</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s2">&quot;token here&quot;</span><span class="p">)</span>
</pre></div>
</div>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="#">Pomice</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.html">Pomice</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="#">Documentation overview</a><ul>
<li>Next: <a href="modules.html" title="next chapter">&lt;no title&gt;</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2021, cloudwithax.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/index.rst.txt"
rel="nofollow">Page source</a>
</div>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/scripts/furo.js"></script>
</body>
</html>

View File

@ -1,128 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>&lt;no title&gt; &#8212; Pomice 1.1.1 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Pomice" href="pomice.html" />
<link rel="prev" title="Welcome to Pomice!" href="index.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.html">Pomice</a><ul>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html">pomice.spotify</a><ul>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.album">spotify.Album</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.client">spotify.Client</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.exceptions">spotify.Exceptions</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.playlist">spotify.Playlist</a></li>
<li class="toctree-l3"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.track">spotify.Track</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.enums">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.events">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.exceptions">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.filters">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.objects">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.player">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.pool">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.utils">Utils</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Pomice</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.html">Pomice</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="index.html" title="previous chapter">Welcome to Pomice!</a></li>
<li>Next: <a href="pomice.html" title="next chapter">Pomice</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2021, cloudwithax.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/modules.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

Binary file not shown.

View File

@ -1,854 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>Pomice &#8212; Pomice 1.1.1 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Spotify" href="pomice.spotify.html" />
<link rel="prev" title="&lt;no title&gt;" href="modules.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="pomice">
<h1>Pomice<a class="headerlink" href="#pomice" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.spotify.html">Spotify</a><ul>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.album">spotify.Album</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.client">spotify.Client</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.exceptions">spotify.Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.playlist">spotify.Playlist</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html#module-pomice.spotify.track">spotify.Track</a></li>
</ul>
</li>
</ul>
</div>
<section id="module-pomice.enums">
<span id="enums"></span><h2>Enums<a class="headerlink" href="#module-pomice.enums" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.enums.SearchType">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.enums.</span></span><span class="sig-name descname"><span class="pre">SearchType</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">value</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.enums.SearchType" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">enum.Enum</span></code></p>
<p>The enum for the different search types for Pomice.
This feature is exclusively for the Spotify search feature of Pomice.
If you are not using this feature, this class is not necessary.</p>
<p>SearchType.ytsearch searches using regular Youtube,
which is best for all scenarios.</p>
<p>SearchType.ytmsearch searches using YouTube Music,
which is best for getting audio-only results.</p>
<p>SearchType.scsearch searches using SoundCloud,
which is an alternative to YouTube or YouTube Music.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.enums.SearchType.scsearch">
<span class="sig-name descname"><span class="pre">scsearch</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'scsearch'</span></em><a class="headerlink" href="#pomice.enums.SearchType.scsearch" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.enums.SearchType.ytmsearch">
<span class="sig-name descname"><span class="pre">ytmsearch</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'ytmsearch'</span></em><a class="headerlink" href="#pomice.enums.SearchType.ytmsearch" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.enums.SearchType.ytsearch">
<span class="sig-name descname"><span class="pre">ytsearch</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'ytsearch'</span></em><a class="headerlink" href="#pomice.enums.SearchType.ytsearch" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
</section>
<section id="module-pomice.events">
<span id="events"></span><h2>Events<a class="headerlink" href="#module-pomice.events" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.PomiceEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">PomiceEvent</span></span><a class="headerlink" href="#pomice.events.PomiceEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for all events dispatched by a node.
Every event must be formatted within your bots code as a listener.
i.e: If you want to listen for when a track starts, the event would be:
<code class="docutils literal notranslate"><span class="pre">`py</span>
<span class="pre">&#64;bot.listen</span>
<span class="pre">async</span> <span class="pre">def</span> <span class="pre">on_pomice_track_start(self,</span> <span class="pre">event):</span>
<span class="pre">`</span></code></p>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.events.PomiceEvent.dispatch">
<span class="sig-name descname"><span class="pre">dispatch</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bot</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.bot.AutoShardedBot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.shard.AutoShardedClient</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.ext.commands.bot.Bot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.client.Client</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.PomiceEvent.dispatch" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.PomiceEvent.handler_args">
<span class="sig-name descname"><span class="pre">handler_args</span></span><em class="property"> <span class="pre">=</span> <span class="pre">()</span></em><a class="headerlink" href="#pomice.events.PomiceEvent.handler_args" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.PomiceEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'event'</span></em><a class="headerlink" href="#pomice.events.PomiceEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.TrackEndEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">TrackEndEvent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.TrackEndEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.events.PomiceEvent" title="pomice.events.PomiceEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.events.PomiceEvent</span></code></a></p>
<p>Fired when a track has successfully ended.
Returns the player associated with the event along with the pomice.Track object and reason.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.TrackEndEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'track_end'</span></em><a class="headerlink" href="#pomice.events.TrackEndEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.TrackExceptionEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">TrackExceptionEvent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.TrackExceptionEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.events.PomiceEvent" title="pomice.events.PomiceEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.events.PomiceEvent</span></code></a></p>
<p>Fired when a track error has occured.
Returns the player associated with the event along with the error code and exception.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.TrackExceptionEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'track_exception'</span></em><a class="headerlink" href="#pomice.events.TrackExceptionEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.TrackStartEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">TrackStartEvent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.TrackStartEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.events.PomiceEvent" title="pomice.events.PomiceEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.events.PomiceEvent</span></code></a></p>
<p>Fired when a track has successfully started.
Returns the player associated with the event and the pomice.Track object.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.TrackStartEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'track_start'</span></em><a class="headerlink" href="#pomice.events.TrackStartEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.TrackStuckEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">TrackStuckEvent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.TrackStuckEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.events.PomiceEvent" title="pomice.events.PomiceEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.events.PomiceEvent</span></code></a></p>
<p>Fired when a track is stuck and cannot be played. Returns the player
associated with the event along with the pomice.Track object
to be further parsed by the end user.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.TrackStuckEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'track_stuck'</span></em><a class="headerlink" href="#pomice.events.TrackStuckEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.WebSocketClosedEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">WebSocketClosedEvent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.WebSocketClosedEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.events.PomiceEvent" title="pomice.events.PomiceEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.events.PomiceEvent</span></code></a></p>
<p>Fired when a websocket connection to a node has been closed.
Returns the reason and the error code.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.WebSocketClosedEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'websocket_closed'</span></em><a class="headerlink" href="#pomice.events.WebSocketClosedEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.WebSocketClosedPayload">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">WebSocketClosedPayload</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.WebSocketClosedPayload" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.events.WebSocketOpenEvent">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.events.</span></span><span class="sig-name descname"><span class="pre">WebSocketOpenEvent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.events.WebSocketOpenEvent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.events.PomiceEvent" title="pomice.events.PomiceEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.events.PomiceEvent</span></code></a></p>
<p>Fired when a websocket connection to a node has been initiated.
Returns the target and the session SSRC.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="pomice.events.WebSocketOpenEvent.name">
<span class="sig-name descname"><span class="pre">name</span></span><em class="property"> <span class="pre">=</span> <span class="pre">'websocket_open'</span></em><a class="headerlink" href="#pomice.events.WebSocketOpenEvent.name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
</section>
<section id="module-pomice.exceptions">
<span id="exceptions"></span><h2>Exceptions<a class="headerlink" href="#module-pomice.exceptions" title="Permalink to this headline"></a></h2>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.FilterInvalidArgument">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">FilterInvalidArgument</span></span><a class="headerlink" href="#pomice.exceptions.FilterInvalidArgument" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>An invalid argument was passed to a filter.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.InvalidSpotifyClientAuthorization">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">InvalidSpotifyClientAuthorization</span></span><a class="headerlink" href="#pomice.exceptions.InvalidSpotifyClientAuthorization" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>No Spotify client authorization was provided for track searching.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.NoNodesAvailable">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">NoNodesAvailable</span></span><a class="headerlink" href="#pomice.exceptions.NoNodesAvailable" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>There are no nodes currently available.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.NodeConnectionClosed">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">NodeConnectionClosed</span></span><a class="headerlink" href="#pomice.exceptions.NodeConnectionClosed" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.NodeException" title="pomice.exceptions.NodeException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.NodeException</span></code></a></p>
<p>The nodes connection is closed.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.NodeConnectionFailure">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">NodeConnectionFailure</span></span><a class="headerlink" href="#pomice.exceptions.NodeConnectionFailure" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.NodeException" title="pomice.exceptions.NodeException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.NodeException</span></code></a></p>
<p>There was a problem while connecting to the node.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.NodeCreationError">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">NodeCreationError</span></span><a class="headerlink" href="#pomice.exceptions.NodeCreationError" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.NodeException" title="pomice.exceptions.NodeException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.NodeException</span></code></a></p>
<p>There was a problem while creating the node.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.NodeException">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">NodeException</span></span><a class="headerlink" href="#pomice.exceptions.NodeException" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
<p>Base exception for nodes.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.NodeNotAvailable">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">NodeNotAvailable</span></span><a class="headerlink" href="#pomice.exceptions.NodeNotAvailable" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>The node is currently unavailable.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.PomiceException">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">PomiceException</span></span><a class="headerlink" href="#pomice.exceptions.PomiceException" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
<p>Base of all Pomice exceptions.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.SpotifyAlbumLoadFailed">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">SpotifyAlbumLoadFailed</span></span><a class="headerlink" href="#pomice.exceptions.SpotifyAlbumLoadFailed" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>The pomice Spotify client was unable to load an album.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.SpotifyPlaylistLoadFailed">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">SpotifyPlaylistLoadFailed</span></span><a class="headerlink" href="#pomice.exceptions.SpotifyPlaylistLoadFailed" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>The pomice Spotify client was unable to load a playlist.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.SpotifyTrackLoadFailed">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">SpotifyTrackLoadFailed</span></span><a class="headerlink" href="#pomice.exceptions.SpotifyTrackLoadFailed" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>The pomice Spotify client was unable to load a track.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.TrackInvalidPosition">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">TrackInvalidPosition</span></span><a class="headerlink" href="#pomice.exceptions.TrackInvalidPosition" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>An invalid position was chosen for a track.</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.exceptions.TrackLoadError">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.exceptions.</span></span><span class="sig-name descname"><span class="pre">TrackLoadError</span></span><a class="headerlink" href="#pomice.exceptions.TrackLoadError" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.exceptions.PomiceException" title="pomice.exceptions.PomiceException"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.exceptions.PomiceException</span></code></a></p>
<p>There was an error while loading a track.</p>
</dd></dl>
</section>
<section id="module-pomice.filters">
<span id="filters"></span><h2>Filters<a class="headerlink" href="#module-pomice.filters" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.ChannelMix">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">ChannelMix</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">left_to_left</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">right_to_right</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">left_to_right</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">right_to_left</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.ChannelMix" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which manually adjusts the panning of the audio, which can make
for some cool effects when done correctly.</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Distortion">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Distortion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sin_offset</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sin_scale</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cos_offset</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cos_scale</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">tan_offset</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">tan_scale</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">offset</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scale</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Distortion" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which generates a distortion effect. Useful for certain filter implementations where
distortion is needed.</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Equalizer">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Equalizer</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">levels</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">list</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Equalizer" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Filter which represents a 15 band equalizer.
You can adjust the dynamic of the sound using this filter.
i.e: Applying a bass boost filter to emphasize the bass in a song.
The format for the levels is: List[Tuple[int, float]]</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Filter">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Filter</span></span><a class="headerlink" href="#pomice.filters.Filter" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Karaoke">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Karaoke</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">level</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mono_level</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">filter_band</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">220.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">filter_width</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">100.0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Karaoke" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which filters the vocal track from any song and leaves the instrumental.
Best for karaoke as the filter implies.</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.LowPass">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">LowPass</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">smoothing</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">20</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.LowPass" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which supresses higher frequencies and allows lower frequencies to pass.
You can also do this with the Equalizer filter, but this is an easier way to do it.</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Rotation">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Rotation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rotation_hertz</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">5</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Rotation" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which produces a stereo-like panning effect, which sounds like
the audio is being rotated around the listeners head</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Timescale">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Timescale</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">speed</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pitch</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Timescale" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which changes the speed and pitch of a track.
Do be warned that this filter is bugged as of the lastest Lavalink dev version
due to the filter patch not corresponding with the track time.</p>
<p>In short this means that your track will either end prematurely or end later due to this.
This is not the librarys fault.</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Tremolo">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Tremolo</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">frequency</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">2.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">depth</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0.5</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Tremolo" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which produces a wavering tone in the music,
causing it to sound like the music is changing in volume rapidly.</p>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.filters.Vibrato">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.filters.</span></span><span class="sig-name descname"><span class="pre">Vibrato</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">frequency</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">2.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">depth</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0.5</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.filters.Vibrato" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><code class="xref py py-class docutils literal notranslate"><span class="pre">pomice.filters.Filter</span></code></a></p>
<p>Filter which produces a wavering tone in the music, similar to the Tremolo filter,
but changes in pitch rather than volume.</p>
</dd></dl>
</section>
<section id="module-pomice.objects">
<span id="objects"></span><h2>Objects<a class="headerlink" href="#module-pomice.objects" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.objects.Playlist">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.objects.</span></span><span class="sig-name descname"><span class="pre">Playlist</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">playlist_info</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">tracks</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">list</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ctx</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.context.Context</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">spotify</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thumbnail</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">uri</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.objects.Playlist" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base playlist object.
Returns critical playlist information needed for parsing by Lavalink.
You can also pass in commands.Context to get a discord.py Context object in your tracks.</p>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.objects.Playlist.thumbnail">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">thumbnail</span></span><em class="property"><span class="pre">:</span> <span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#pomice.objects.Playlist.thumbnail" title="Permalink to this definition"></a></dt>
<dd><p>Spotify album/playlist thumbnail, or None if not a Spotify object.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.objects.Playlist.uri">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">uri</span></span><em class="property"><span class="pre">:</span> <span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#pomice.objects.Playlist.uri" title="Permalink to this definition"></a></dt>
<dd><p>Spotify album/playlist URI, or None if not a Spotify object.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.objects.Track">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.objects.</span></span><span class="sig-name descname"><span class="pre">Track</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">track_id</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">info</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ctx</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.context.Context</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">spotify</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">search_type</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#pomice.enums.SearchType" title="pomice.enums.SearchType"><span class="pre">pomice.enums.SearchType</span></a></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">SearchType.ytsearch</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.objects.Track" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base track object. Returns critical track information needed for parsing by Lavalink.
You can also pass in commands.Context to get a discord.py Context object in your track.</p>
</dd></dl>
</section>
<section id="module-pomice.player">
<span id="player"></span><h2>Player<a class="headerlink" href="#module-pomice.player" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.player.Player">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.player.</span></span><span class="sig-name descname"><span class="pre">Player</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.bot.AutoShardedBot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.shard.AutoShardedClient</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.ext.commands.bot.Bot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.client.Client</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">channel</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.channel.VoiceChannel</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">discord.voice_client.VoiceProtocol</span></code></p>
<p>The base player class for Pomice.
In order to initiate a player, you must pass it in as a cls when you connect to a channel.
i.e: <code class="docutils literal notranslate"><span class="pre">`py</span>
<span class="pre">await</span> <span class="pre">ctx.author.voice.channel.connect(cls=pomice.Player)</span>
<span class="pre">`</span></code></p>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.bot">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">bot</span></span><em class="property"><span class="pre">:</span> <span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.bot.AutoShardedBot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.shard.AutoShardedClient</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.ext.commands.bot.Bot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.client.Client</span><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#pomice.player.Player.bot" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the bot associated with this player instance</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.connect">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">connect</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">reconnect</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.connect" title="Permalink to this definition"></a></dt>
<dd><p><a href="#id3"><span class="problematic" id="id4">|coro|</span></a></p>
<p>An abstract method called when the client initiates the connection request.</p>
<p>When a connection is requested initially, the library calls the constructor
under <code class="docutils literal notranslate"><span class="pre">__init__</span></code> and then calls <a class="reference internal" href="#pomice.player.Player.connect" title="pomice.player.Player.connect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">connect()</span></code></a>. If <a class="reference internal" href="#pomice.player.Player.connect" title="pomice.player.Player.connect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">connect()</span></code></a> fails at
some point then <a class="reference internal" href="#pomice.player.Player.disconnect" title="pomice.player.Player.disconnect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">disconnect()</span></code></a> is called.</p>
<p>Within this method, to start the voice connection flow it is recommended to
use <code class="xref py py-meth docutils literal notranslate"><span class="pre">Guild.change_voice_state()</span></code> to start the flow. After which,
<a class="reference internal" href="#pomice.player.Player.on_voice_server_update" title="pomice.player.Player.on_voice_server_update"><code class="xref py py-meth docutils literal notranslate"><span class="pre">on_voice_server_update()</span></code></a> and <a class="reference internal" href="#pomice.player.Player.on_voice_state_update" title="pomice.player.Player.on_voice_state_update"><code class="xref py py-meth docutils literal notranslate"><span class="pre">on_voice_state_update()</span></code></a> will be called.
The order that these two are called is unspecified.</p>
<dl class="simple">
<dt>timeout: <code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></dt><dd><p>The timeout for the connection.</p>
</dd>
<dt>reconnect: <code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></dt><dd><p>Whether reconnection is expected.</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.current">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">current</span></span><em class="property"><span class="pre">:</span> <a class="reference internal" href="#pomice.objects.Track" title="pomice.objects.Track"><span class="pre">pomice.objects.Track</span></a></em><a class="headerlink" href="#pomice.player.Player.current" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the currently playing track</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.destroy">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">destroy</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.destroy" title="Permalink to this definition"></a></dt>
<dd><p>Disconnects and destroys the player, and runs internal cleanup.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.disconnect">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">disconnect</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">force</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.disconnect" title="Permalink to this definition"></a></dt>
<dd><p>Disconnects the player from voice.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.filter">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">filter</span></span><em class="property"><span class="pre">:</span> <a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><span class="pre">pomice.filters.Filter</span></a></em><a class="headerlink" href="#pomice.player.Player.filter" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the currently applied filter, if one is applied</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.get_tracks">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">get_tracks</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ctx</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.context.Context</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">search_type</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#pomice.enums.SearchType" title="pomice.enums.SearchType"><span class="pre">pomice.enums.SearchType</span></a></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">SearchType.ytsearch</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.get_tracks" title="Permalink to this definition"></a></dt>
<dd><p>Fetches tracks from the nodes REST api to parse into Lavalink.</p>
<p>If you passed in Spotify API credentials when you created the node,
you can also pass in a Spotify URL of a playlist, album or track and it will be parsed
accordingly.</p>
<p>You can also pass in a discord.py Context object to get a
Context object on any track you search.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.guild">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">guild</span></span><em class="property"><span class="pre">:</span> <span class="pre">discord.guild.Guild</span></em><a class="headerlink" href="#pomice.player.Player.guild" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the guild associated with the player</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.is_connected">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">is_connected</span></span><em class="property"><span class="pre">:</span> <span class="pre">bool</span></em><a class="headerlink" href="#pomice.player.Player.is_connected" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns whether or not the player is connected</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.is_dead">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">is_dead</span></span><em class="property"><span class="pre">:</span> <span class="pre">bool</span></em><a class="headerlink" href="#pomice.player.Player.is_dead" title="Permalink to this definition"></a></dt>
<dd><p>Returns a bool representing whether the player is dead or not.
A player is considered dead if it has been destroyed and removed from stored players.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.is_paused">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">is_paused</span></span><em class="property"><span class="pre">:</span> <span class="pre">bool</span></em><a class="headerlink" href="#pomice.player.Player.is_paused" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns whether or not the player has a track which is paused or not.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.is_playing">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">is_playing</span></span><em class="property"><span class="pre">:</span> <span class="pre">bool</span></em><a class="headerlink" href="#pomice.player.Player.is_playing" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns whether or not the player is actively playing a track.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.node">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">node</span></span><em class="property"><span class="pre">:</span> <a class="reference internal" href="#pomice.pool.Node" title="pomice.pool.Node"><span class="pre">pomice.pool.Node</span></a></em><a class="headerlink" href="#pomice.player.Player.node" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the node the player is connected to</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.on_voice_server_update">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">on_voice_server_update</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.on_voice_server_update" title="Permalink to this definition"></a></dt>
<dd><p><a href="#id5"><span class="problematic" id="id6">|coro|</span></a></p>
<p>An abstract method that is called when initially connecting to voice.
This corresponds to <code class="docutils literal notranslate"><span class="pre">VOICE_SERVER_UPDATE</span></code>.</p>
<dl class="simple">
<dt>data: <code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></dt><dd><p>The raw <a class="reference external" href="https://discord.com/developers/docs/topics/gateway#voice-server-update-voice-server-update-event-fields">voice server update payload</a>.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.on_voice_state_update">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">on_voice_state_update</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.on_voice_state_update" title="Permalink to this definition"></a></dt>
<dd><p><a href="#id7"><span class="problematic" id="id8">|coro|</span></a></p>
<p>An abstract method that is called when the clients voice state
has changed. This corresponds to <code class="docutils literal notranslate"><span class="pre">VOICE_STATE_UPDATE</span></code>.</p>
<dl class="simple">
<dt>data: <code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></dt><dd><p>The raw <a class="reference external" href="https://discord.com/developers/docs/resources/voice#voice-state-object">voice state payload</a>.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.play">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">play</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">track</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#pomice.objects.Track" title="pomice.objects.Track"><span class="pre">pomice.objects.Track</span></a></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">start</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">end</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_if_playing</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#pomice.objects.Track" title="pomice.objects.Track"><span class="pre">pomice.objects.Track</span></a></span></span><a class="headerlink" href="#pomice.player.Player.play" title="Permalink to this definition"></a></dt>
<dd><p>Plays a track. If a Spotify track is passed in, it will be handled accordingly.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.position">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">position</span></span><em class="property"><span class="pre">:</span> <span class="pre">float</span></em><a class="headerlink" href="#pomice.player.Player.position" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the players position in a track in milliseconds</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.seek">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">seek</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">position</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">float</span></span></span><a class="headerlink" href="#pomice.player.Player.seek" title="Permalink to this definition"></a></dt>
<dd><p>Seeks to a position in the currently playing track milliseconds</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.set_filter">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">set_filter</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filter</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><span class="pre">pomice.filters.Filter</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#pomice.filters.Filter" title="pomice.filters.Filter"><span class="pre">pomice.filters.Filter</span></a></span></span><a class="headerlink" href="#pomice.player.Player.set_filter" title="Permalink to this definition"></a></dt>
<dd><p>Sets a filter of the player. Takes a pomice.Filter object.
This will only work if you are using the development version of Lavalink.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.set_pause">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">set_pause</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">pause</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#pomice.player.Player.set_pause" title="Permalink to this definition"></a></dt>
<dd><p>Sets the pause state of the currently playing track.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.set_volume">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">set_volume</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">volume</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#pomice.player.Player.set_volume" title="Permalink to this definition"></a></dt>
<dd><p>Sets the volume of the player as an integer. Lavalink accepts values from 0 to 500.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.player.Player.stop">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">stop</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#pomice.player.Player.stop" title="Permalink to this definition"></a></dt>
<dd><p>Stops the currently playing track.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.player.Player.volume">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">volume</span></span><em class="property"><span class="pre">:</span> <span class="pre">int</span></em><a class="headerlink" href="#pomice.player.Player.volume" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the players current volume</p>
</dd></dl>
</dd></dl>
</section>
<section id="module-pomice.pool">
<span id="pool"></span><h2>Pool<a class="headerlink" href="#module-pomice.pool" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.pool.Node">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.pool.</span></span><span class="sig-name descname"><span class="pre">Node</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pool</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bot</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.bot.AutoShardedBot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.shard.AutoShardedClient</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.ext.commands.bot.Bot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.client.Client</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">host</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">password</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">identifier</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">session</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">aiohttp.client.ClientSession</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">spotify_client_id</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">spotify_client_secret</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.pool.Node" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for a node.
This node object represents a Lavalink node.
To enable Spotify searching, pass in a proper Spotify Client ID and Spotify Client Secret</p>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.bot">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">bot</span></span><em class="property"><span class="pre">:</span> <span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.bot.AutoShardedBot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.shard.AutoShardedClient</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.ext.commands.bot.Bot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.client.Client</span><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#pomice.pool.Node.bot" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the discord.py client linked to this node</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.Node.build_track">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">build_track</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">identifier</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ctx</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.context.Context</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#pomice.objects.Track" title="pomice.objects.Track"><span class="pre">pomice.objects.Track</span></a></span></span><a class="headerlink" href="#pomice.pool.Node.build_track" title="Permalink to this definition"></a></dt>
<dd><p>Builds a track using a valid track identifier</p>
<p>You can also pass in a discord.py Context object to get a
Context object on the track it builds.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.Node.connect">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">connect</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#pomice.pool.Node.connect" title="Permalink to this definition"></a></dt>
<dd><p>Initiates a connection with a Lavalink node and adds it to the node pool.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.Node.disconnect">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">disconnect</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#pomice.pool.Node.disconnect" title="Permalink to this definition"></a></dt>
<dd><p>Disconnects a connected Lavalink node and removes it from the node pool.
This also destroys any players connected to the node.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.Node.get_player">
<span class="sig-name descname"><span class="pre">get_player</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">guild_id</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.pool.Node.get_player" title="Permalink to this definition"></a></dt>
<dd><p>Takes a guild ID as a parameter. Returns a pomice Player object.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.Node.get_tracks">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">get_tracks</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ctx</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.context.Context</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">search_type</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#pomice.enums.SearchType" title="pomice.enums.SearchType"><span class="pre">pomice.enums.SearchType</span></a></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">SearchType.ytsearch</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.pool.Node.get_tracks" title="Permalink to this definition"></a></dt>
<dd><p>Fetches tracks from the nodes REST api to parse into Lavalink.</p>
<p>If you passed in Spotify API credentials, you can also pass in a
Spotify URL of a playlist, album or track and it will be parsed accordingly.</p>
<p>You can also pass in a discord.py Context object to get a
Context object on any track you search.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.is_connected">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">is_connected</span></span><em class="property"><span class="pre">:</span> <span class="pre">bool</span></em><a class="headerlink" href="#pomice.pool.Node.is_connected" title="Permalink to this definition"></a></dt>
<dd><p>“Property which returns whether this node is connected or not</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.latency">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">latency</span></span><em class="property"><span class="pre">:</span> <span class="pre">int</span></em><a class="headerlink" href="#pomice.pool.Node.latency" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the latency of the node in milliseconds</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.player_count">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">player_count</span></span><em class="property"><span class="pre">:</span> <span class="pre">int</span></em><a class="headerlink" href="#pomice.pool.Node.player_count" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns how many players are connected to this node</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.players">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">players</span></span><em class="property"><span class="pre">:</span> <span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">,</span> </span><span class="pre">Player</span><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#pomice.pool.Node.players" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns a dict containing the guild ID and the player object.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.pool">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">pool</span></span><a class="headerlink" href="#pomice.pool.Node.pool" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the pool this node is apart of</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.Node.send">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">send</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">data</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.pool.Node.send" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.Node.stats">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">stats</span></span><em class="property"><span class="pre">:</span> <a class="reference internal" href="#pomice.utils.NodeStats" title="pomice.utils.NodeStats"><span class="pre">pomice.utils.NodeStats</span></a></em><a class="headerlink" href="#pomice.pool.Node.stats" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns the node stats.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.pool.NodePool">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.pool.</span></span><span class="sig-name descname"><span class="pre">NodePool</span></span><a class="headerlink" href="#pomice.pool.NodePool" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for the node pool.
This holds all the nodes that are to be used by the bot.</p>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.NodePool.create_node">
<em class="property"><span class="pre">async</span> <span class="pre">classmethod</span> </em><span class="sig-name descname"><span class="pre">create_node</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bot</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">discord.ext.commands.bot.AutoShardedBot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.shard.AutoShardedClient</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.ext.commands.bot.Bot</span><span class="p"><span class="pre">,</span> </span><span class="pre">discord.client.Client</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">host</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">password</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">identifier</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">spotify_client_id</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">spotify_client_secret</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">session</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">aiohttp.client.ClientSession</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#pomice.pool.Node" title="pomice.pool.Node"><span class="pre">pomice.pool.Node</span></a></span></span><a class="headerlink" href="#pomice.pool.NodePool.create_node" title="Permalink to this definition"></a></dt>
<dd><p>Creates a Node object to be then added into the node pool.
For Spotify searching capabilites, pass in valid Spotify API credentials.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.pool.NodePool.get_node">
<em class="property"><span class="pre">classmethod</span> </em><span class="sig-name descname"><span class="pre">get_node</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">identifier</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#pomice.pool.Node" title="pomice.pool.Node"><span class="pre">pomice.pool.Node</span></a></span></span><a class="headerlink" href="#pomice.pool.NodePool.get_node" title="Permalink to this definition"></a></dt>
<dd><p>Fetches a node from the node pool using its identifier.
If no identifier is provided, it will choose a node at random.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.NodePool.node_count">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">node_count</span></span><a class="headerlink" href="#pomice.pool.NodePool.node_count" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="pomice.pool.NodePool.nodes">
<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">nodes</span></span><em class="property"><span class="pre">:</span> <span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><a class="reference internal" href="#pomice.pool.Node" title="pomice.pool.Node"><span class="pre">pomice.pool.Node</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#pomice.pool.NodePool.nodes" title="Permalink to this definition"></a></dt>
<dd><p>Property which returns a dict with the node identifier and the Node object.</p>
</dd></dl>
</dd></dl>
</section>
<section id="module-pomice.utils">
<span id="utils"></span><h2>Utils<a class="headerlink" href="#module-pomice.utils" title="Permalink to this headline"></a></h2>
<p>The MIT License (MIT)
Copyright (c) 2015-present Rapptz
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the “Software”),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.</p>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.utils.ExponentialBackoff">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.utils.</span></span><span class="sig-name descname"><span class="pre">ExponentialBackoff</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">base</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">integral</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.utils.ExponentialBackoff" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.utils.ExponentialBackoff.delay">
<span class="sig-name descname"><span class="pre">delay</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">float</span></span></span><a class="headerlink" href="#pomice.utils.ExponentialBackoff.delay" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.utils.NodeStats">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.utils.</span></span><span class="sig-name descname"><span class="pre">NodeStats</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.utils.NodeStats" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for the node stats object.
Gives critical information on the node, which is updated every minute.</p>
</dd></dl>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Pomice</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Pomice</a><ul>
<li class="toctree-l2"><a class="reference internal" href="pomice.spotify.html">Spotify</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.enums">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.events">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.exceptions">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.filters">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.objects">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.player">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.pool">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="#module-pomice.utils">Utils</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">&lt;no title&gt;</a><ul>
<li>Previous: <a href="modules.html" title="previous chapter">&lt;no title&gt;</a></li>
<li>Next: <a href="pomice.spotify.html" title="next chapter">Spotify</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2021, cloudwithax.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/pomice.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@ -1,192 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>Spotify &#8212; Pomice 1.1.1 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Pomice" href="pomice.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="spotify">
<h1>Spotify<a class="headerlink" href="#spotify" title="Permalink to this headline"></a></h1>
<section id="module-pomice.spotify.album">
<span id="spotify-album"></span><h2>spotify.Album<a class="headerlink" href="#module-pomice.spotify.album" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.spotify.album.Album">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.spotify.album.</span></span><span class="sig-name descname"><span class="pre">Album</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.spotify.album.Album" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for a Spotify album</p>
</dd></dl>
</section>
<section id="module-pomice.spotify.client">
<span id="spotify-client"></span><h2>spotify.Client<a class="headerlink" href="#module-pomice.spotify.client" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.spotify.client.Client">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.spotify.client.</span></span><span class="sig-name descname"><span class="pre">Client</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client_id</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">client_secret</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.spotify.client.Client" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base client for the Spotify module of Pomice.
This class will do all the heavy lifting of getting all the metadata
for any Spotify URL you throw at it.</p>
<dl class="py method">
<dt class="sig sig-object py" id="pomice.spotify.client.Client.search">
<em class="property"><span class="pre">async</span> </em><span class="sig-name descname"><span class="pre">search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">query</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.spotify.client.Client.search" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
</section>
<section id="module-pomice.spotify.exceptions">
<span id="spotify-exceptions"></span><h2>spotify.Exceptions<a class="headerlink" href="#module-pomice.spotify.exceptions" title="Permalink to this headline"></a></h2>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.spotify.exceptions.InvalidSpotifyURL">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.spotify.exceptions.</span></span><span class="sig-name descname"><span class="pre">InvalidSpotifyURL</span></span><a class="headerlink" href="#pomice.spotify.exceptions.InvalidSpotifyURL" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
<p>An invalid Spotify URL was passed</p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="pomice.spotify.exceptions.SpotifyRequestException">
<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.spotify.exceptions.</span></span><span class="sig-name descname"><span class="pre">SpotifyRequestException</span></span><a class="headerlink" href="#pomice.spotify.exceptions.SpotifyRequestException" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
<p>An error occurred when making a request to the Spotify API</p>
</dd></dl>
</section>
<section id="module-pomice.spotify.playlist">
<span id="spotify-playlist"></span><h2>spotify.Playlist<a class="headerlink" href="#module-pomice.spotify.playlist" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.spotify.playlist.Playlist">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.spotify.playlist.</span></span><span class="sig-name descname"><span class="pre">Playlist</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">tracks</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#pomice.spotify.track.Track" title="pomice.spotify.track.Track"><span class="pre">pomice.spotify.track.Track</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.spotify.playlist.Playlist" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for a Spotify playlist</p>
</dd></dl>
</section>
<section id="module-pomice.spotify.track">
<span id="spotify-track"></span><h2>spotify.Track<a class="headerlink" href="#module-pomice.spotify.track" title="Permalink to this headline"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="pomice.spotify.track.Track">
<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">pomice.spotify.track.</span></span><span class="sig-name descname"><span class="pre">Track</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pomice.spotify.track.Track" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>The base class for a Spotify Track</p>
</dd></dl>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Pomice</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="pomice.html">Pomice</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Spotify</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#module-pomice.spotify.album">spotify.Album</a></li>
<li class="toctree-l3"><a class="reference internal" href="#module-pomice.spotify.client">spotify.Client</a></li>
<li class="toctree-l3"><a class="reference internal" href="#module-pomice.spotify.exceptions">spotify.Exceptions</a></li>
<li class="toctree-l3"><a class="reference internal" href="#module-pomice.spotify.playlist">spotify.Playlist</a></li>
<li class="toctree-l3"><a class="reference internal" href="#module-pomice.spotify.track">spotify.Track</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.enums">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.events">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.exceptions">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.filters">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.objects">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.player">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.pool">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="pomice.html#module-pomice.utils">Utils</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">&lt;no title&gt;</a><ul>
<li><a href="pomice.html">Pomice</a><ul>
<li>Previous: <a href="pomice.html" title="previous chapter">Pomice</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2021, cloudwithax.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/pomice.spotify.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

View File

@ -1,183 +1,341 @@
<!doctype html>
<html class="no-js" lang="en">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" />
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Python Module Index &#8212; Pomice 1.1.1 documentation</title>
<!-- Generated with Sphinx 5.3.0 and Furo 2022.12.07 --><title>Python Module Index - Pomice</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=91d0f0d1c444bdcb17a68e833c7a53903343c195" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
</head><body>
<style>
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-half" viewBox="0 0 24 24">
<title>Auto light/dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="12" r="9" />
<path d="M13 12h5" />
<path d="M13 15h4" />
<path d="M13 18h1" />
<path d="M13 9h4" />
<path d="M13 6h1" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
<div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
<div class="visually-hidden">Hide table of contents sidebar</div>
</label>
<div class="body" role="main">
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<div class="visually-hidden">Toggle site navigation sidebar</div>
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
</div>
<div class="header-center">
<a href="index.html"><div class="brand">Pomice</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<h1>Python Module Index</h1>
<span class="sidebar-brand-text">Pomice</span>
<div class="modindex-jumpbox">
<a href="#cap-p"><strong>p</strong></a>
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Before You Start</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quick Jumpstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="faq.html">Frequently Asked Questions</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">How Do I?</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="hdi/index.html">How Do I?</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="hdi/pool.html">Use the NodePool class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/node.html">Use the Node class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/player.html">Use the Player class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/filters.html">Use the Filter class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/queue.html">Use the Queue class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/events.html">Use the Events class</a></li>
</ul>
</li>
</ul>
<p class="caption" role="heading"><span class="caption-text">API Reference</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="api/index.html">API Reference</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="api/enums.html">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/events.html">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/exceptions.html">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/filters.html">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/objects.html">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/player.html">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/pool.html">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/queue.html">Queue</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/utils.html">Utils</a></li>
</ul>
</li>
</ul>
</div>
</div>
<table class="indextable modindextable">
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-p"><td></td><td>
<strong>p</strong></td><td></td></tr>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
<article role="main">
<section class="domainindex-section">
<h1>Python Module Index</h1>
<div class="domainindex-jumpbox"><a href="#cap-p"><strong>p</strong></a></div>
</section>
<table class="domainindex-table">
<tr class="pcap">
<td></td><td>&#160;</td><td></td>
</tr>
<tr class="cap" id="cap-p">
<td></td><td><strong>p</strong></td><td></td>
</tr>
<tr>
<td><img src="_static/minus.png" class="toggler"
id="toggle-1" style="display: none" alt="-" /></td>
<td>
<code class="xref">pomice</code></td><td>
<em></em></td></tr>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.enums"><code class="xref">pomice.enums</code></a></td><td>
<em></em></td></tr>
<a href="api/enums.html#module-pomice.enums"><code class="xref">pomice.enums</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.events"><code class="xref">pomice.events</code></a></td><td>
<em></em></td></tr>
<a href="api/events.html#module-pomice.events"><code class="xref">pomice.events</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.exceptions"><code class="xref">pomice.exceptions</code></a></td><td>
<em></em></td></tr>
<a href="api/exceptions.html#module-pomice.exceptions"><code class="xref">pomice.exceptions</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.filters"><code class="xref">pomice.filters</code></a></td><td>
<em></em></td></tr>
<a href="api/filters.html#module-pomice.filters"><code class="xref">pomice.filters</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.objects"><code class="xref">pomice.objects</code></a></td><td>
<em></em></td></tr>
<a href="api/objects.html#module-pomice.objects"><code class="xref">pomice.objects</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.player"><code class="xref">pomice.player</code></a></td><td>
<em></em></td></tr>
<a href="api/player.html#module-pomice.player"><code class="xref">pomice.player</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.pool"><code class="xref">pomice.pool</code></a></td><td>
<em></em></td></tr>
<a href="api/pool.html#module-pomice.pool"><code class="xref">pomice.pool</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.spotify.html#module-pomice.spotify.album"><code class="xref">pomice.spotify.album</code></a></td><td>
<em></em></td></tr>
<a href="api/queue.html#module-pomice.queue"><code class="xref">pomice.queue</code></a></td><td>
<em></em></td>
</tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.spotify.html#module-pomice.spotify.client"><code class="xref">pomice.spotify.client</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.spotify.html#module-pomice.spotify.exceptions"><code class="xref">pomice.spotify.exceptions</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.spotify.html#module-pomice.spotify.playlist"><code class="xref">pomice.spotify.playlist</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.spotify.html#module-pomice.spotify.track"><code class="xref">pomice.spotify.track</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pomice.html#module-pomice.utils"><code class="xref">pomice.utils</code></a></td><td>
<em></em></td></tr>
<a href="api/utils.html#module-pomice.utils"><code class="xref">pomice.utils</code></a></td><td>
<em></em></td>
</tr>
</table>
</article>
</div>
<footer>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Pomice</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.html">Pomice</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2023, cloudwithax
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2021, cloudwithax.
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
<div class="icons">
<a class="muted-link " href="https://github.com/cloudwithax/pomice" aria-label="GitHub">
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path>
</svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/scripts/furo.js"></script>
</body>
</html>

View File

@ -1,122 +1,280 @@
<!doctype html>
<html class="no-js" lang="en">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="#" />
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Search &#8212; Pomice 1.1.1 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
<script src="searchindex.js" defer></script>
<!-- Generated with Sphinx 5.3.0 and Furo 2022.12.07 --><title>Search - Pomice</title><link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=91d0f0d1c444bdcb17a68e833c7a53903343c195" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
<style>
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
</head><body>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-half" viewBox="0 0 24 24">
<title>Auto light/dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="12" r="9" />
<path d="M13 12h5" />
<path d="M13 15h4" />
<path d="M13 18h1" />
<path d="M13 9h4" />
<path d="M13 6h1" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
<div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
<div class="visually-hidden">Hide table of contents sidebar</div>
</label>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<div class="visually-hidden">Toggle site navigation sidebar</div>
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
</div>
<div class="header-center">
<a href="index.html"><div class="brand">Pomice</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="body" role="main">
<span class="sidebar-brand-text">Pomice</span>
<h1 id="search-documentation">Search</h1>
</a><form class="sidebar-search-container" method="get" action="#" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Before You Start</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quick Jumpstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="faq.html">Frequently Asked Questions</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">How Do I?</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="hdi/index.html">How Do I?</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="hdi/pool.html">Use the NodePool class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/node.html">Use the Node class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/player.html">Use the Player class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/filters.html">Use the Filter class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/queue.html">Use the Queue class</a></li>
<li class="toctree-l2"><a class="reference internal" href="hdi/events.html">Use the Events class</a></li>
</ul>
</li>
</ul>
<p class="caption" role="heading"><span class="caption-text">API Reference</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="api/index.html">API Reference</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="api/enums.html">Enums</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/events.html">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/exceptions.html">Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/filters.html">Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/objects.html">Objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/player.html">Player</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/pool.html">Pool</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/queue.html">Queue</a></li>
<li class="toctree-l2"><a class="reference internal" href="api/utils.html">Utils</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
<article role="main">
<noscript>
<div class="admonition warning">
<div class="admonition error">
<p class="admonition-title">Error</p>
<p>
Please activate JavaScript to enable the search
functionality.
Please activate JavaScript to enable the search functionality.
</p>
</div>
</noscript>
<div id="search-results"></div>
<p>
Searching for multiple words only shows matches that contain
all words.
</p>
<form action="" method="get">
<input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results">
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2023, cloudwithax
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
<div class="icons">
<a class="muted-link " href="https://github.com/cloudwithax/pomice" aria-label="GitHub">
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path>
</svg>
</a>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Pomice</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="pomice.html">Pomice</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2021, cloudwithax.
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/sphinx_highlight.js"></script>
<script src="_static/scripts/furo.js"></script>
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
<script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script>
<script src="searchindex.js"></script></body>
</html>

File diff suppressed because one or more lines are too long

9
docs/api/enums.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Enums
-------------------
.. automodule:: pomice.enums
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/events.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Events
--------------------
.. automodule:: pomice.events
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/exceptions.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Exceptions
------------------------
.. automodule:: pomice.exceptions
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/filters.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Filters
---------------------
.. automodule:: pomice.filters
:members:
:undoc-members:
:show-inheritance:
```

18
docs/api/index.md Normal file
View File

@ -0,0 +1,18 @@
# API Reference
Here, you will find the different classes and methods used within Pomice.
```{toctree}
:maxdepth: 1
enums.md
events.md
exceptions.md
filters.md
objects.md
player.md
pool.md
queue.md
utils.md
```

9
docs/api/objects.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Objects
---------------------
.. automodule:: pomice.objects
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/player.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Player
--------------------
.. automodule:: pomice.player
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/pool.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Pool
------------------
.. automodule:: pomice.pool
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/queue.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Queue
------------------
.. automodule:: pomice.queue
:members:
:undoc-members:
:show-inheritance:
```

9
docs/api/utils.md Normal file
View File

@ -0,0 +1,9 @@
```{eval-rst}
Utils
-------------------
.. automodule:: pomice.utils
:members:
:undoc-members:
:show-inheritance:
```

View File

@ -12,7 +12,8 @@
#
import os
import sys
sys.path.insert(0, os.path.abspath('../'))
from typing import Any, Dict
sys.path.insert(0, os.path.abspath('.'))
# -- Project information -----------------------------------------------------
@ -22,7 +23,7 @@ copyright = '2023, cloudwithax'
author = 'cloudwithax'
# The full version, including alpha/beta/rc tags
release = '2.0'
release = '2.1.1'
# -- General configuration ---------------------------------------------------
@ -32,9 +33,28 @@ release = '2.0'
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.autosummary'
'sphinx.ext.autosummary',
'myst_parser'
]
myst_enable_extensions = [
"amsmath",
"colon_fence",
"deflist",
"dollarmath",
"fieldlist",
"html_admonition",
"html_image",
"replacements",
"smartquotes",
"strikethrough",
"substitution",
"tasklist",
]
myst_heading_anchors = 3
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@ -49,9 +69,31 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
html_theme = 'furo'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_title = "Pomice"
language = "en"
html_theme_options: Dict[str, Any] = {
"footer_icons": [
{
"name": "GitHub",
"url": "https://github.com/cloudwithax/pomice",
"html": """
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path>
</svg>
""",
"class": "",
},
],
"source_repository": "https://github.com/cloudwithax/pomice",
"source_branch": "main",
"source_directory": "docs/",
}

27
docs/faq.md Normal file
View File

@ -0,0 +1,27 @@
# Frequently Asked Questions
> Why is it saying "Cannot connect to host"?
Here are some common issues:
- You don't have a Lavalink node installed
- You have a Lavalink node, but it's not configured properly
- You have a Lavalink node and it's configured properly, but is unreachable due to firewall rules or a malformed network configuration.
If you are experiencing the first issue, you can download Lavalink [here.](https://github.com/freyacodes/Lavalink/releases/latest)
As for the other listed issues, either consult the Lavalink docs or go through the proper support channels for your specfic issue at hand.
For any other issues not listed here, please consult your preferred resource for more information.
> What experience do I need?
This library assumes that you have some experience with Python, asynchronous programming and the discord.py library.
> How do I install Pomice?
Refer to the [Installation](installation.md) section.
> How do I use Pomice?
If you are interested in learning how Pomice works, refer to the [API Reference](api/index.md) section.
If you want a quick example, refer to the [Quickstart](quickstart.md) section.

1
docs/hdi/events.md Normal file
View File

@ -0,0 +1 @@
# Use the Events class

1
docs/hdi/filters.md Normal file
View File

@ -0,0 +1 @@
# Use the Filter class

17
docs/hdi/index.md Normal file
View File

@ -0,0 +1,17 @@
# How Do I?
This section covers all the basic functions of Pomice and how to use them.
If you find the [API Reference](../api/index.md) section too confusing or would
rather have a straightforward explanation as to how to use a certain function,
this is for you.
```{toctree}
pool.md
node.md
player.md
filters.md
queue.md
events.md
``

182
docs/hdi/node.md Normal file
View File

@ -0,0 +1,182 @@
# Use the Node class
The `Node` class is one of the main classes you will be interacting with when using Pomice.
The `Node` class has a couple functions you will be using frequently:
- `Node.get_player()`
- `Node.get_tracks()`
- `Node.get_recommendations()`
There are also properties the `Node` class has to access certain values:
:::{list-table}
:header-rows: 1
* - Property
- Type
- Description
* - `Node.bot`
- `Union[Client, Bot]`
- Returns the discord.py client linked to this node.
* - `Node.is_connected`
- `bool`
- Returns whether this node is connected or not.
* - `Node.latency` `Node.ping`
- `float`
- Returns the latency of the node.
* - `Node.player_count`
- `int`
- Returns how many players are connected to this node.
* - `Node.players`
- `Dict[int, Player]`
- Returns a dict containing the guild ID and the player object.
* - `Node.pool`
- `NodePool`
- Returns the pool this node is apart of.
* - `Node.stats`
- `NodeStats`
- Returns the nodes stats.
:::
## Getting a player
To get a player from the nodes list of players, we need to use `Node.get_player()`
```py
await Node.get_player(...)
```
After you have initialized your function, you need to specify the `guild_id` of the player.
```py
await Node.get_player(guild_id=<your guild ID here>)
```
If the node finds a player with the guild ID you provided, it'll return the [](../api/player.md) object associated with the guild ID.
## Getting tracks
To get tracks using Lavalink, we need to use `Node.get_tracks()`
You can also use `Player.get_tracks()` to do the same thing, but this can be used to fetch tracks regardless if a player exists.
```py
await Node.get_tracks(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `query`
- `str`
- The string you want to search up
* - `ctx`
- `Optional[commands.Context]`
- Optional value which sets a `Context` object on the tracks you search.
* - `search_type`
- `SearchType`
- Enum which sets the provider to search from. Default value is `SearchType.ytsearch`
* - `filters`
- `Optional[List[Filter]]`
- Optional value which sets the filters that should apply when the track is played on the tracks you search.
:::
After you set those parameters, your function should look something like this:
```py
await Node.get_tracks(
query="<your query here>",
ctx=<optional ctx object here>,
search_type=<optional search type here>,
filters=[<optional filters here>]
)
```
:::{important}
All querying of Spotify and Apple Music tracks or playlists is handled in this function if you enabled that functionality when creating your node.
If you want to enable it, refer to [](pool.md#adding-a-node)
:::
You should get a list of `Track` in return after running this function for you to then do whatever you want with it.
Ideally, you should be putting all tracks into some sort of a queue. If you would like to learn about how to use
our queue implementation, you can refer to [](queue.md)
## Getting recommendations
To get recommadations using Lavalink, we need to use `Node.get_recommendations()`
You can also use `Player.get_recommendations()` to do the same thing, but this can be used to fetch recommendations regardless if a player exists.
```py
await Node.get_recommendations(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `track`
- `Track`
- The track to fetch recommendations for
* - `ctx`
- `Optional[commands.Context]`
- Optional value which sets a `Context` object on the recommendations you fetch.
:::
After you set those parameters, your function should look something like this:
```py
await Node.get_recommendations(
track=<your track object here>,
ctx=<optional ctx object here>,
)
```
You should get a list of `Track` in return after running this function for you to then do whatever you want with it.
Ideally, you should be putting all tracks into some sort of a queue. If you would like to learn about how to use
our queue implementation, you can refer to [](queue.md)

419
docs/hdi/player.md Normal file
View File

@ -0,0 +1,419 @@
# Use the Player class
The `Player` class is the class you will be interacting with the most within Pomice.
The `Player` class has a couple functions you will be using frequently:
- `Player.add_filter()`
- `Player.destroy()`
- `Player.get_recommendations()`
- `Player.get_tracks()`
- `Player.play()`
- `Player.remove_filter()`
- `Player.reset_filters()`
- `Player.seek()`
- `Player.set_pause()`
- `Player.set_volume()`
- `Player.stop()`
There are also properties the `Player` class has to access certain values:
:::{list-table}
:header-rows: 1
* - Property
- Type
- Description
* - `Player.bot`
- `Union[Client, commands.Bot]`
- Returns the bot associated with this player instance.
* - `Player.current`
- `Track`
- Returns the currently playing track.
* - `Player.filters`
- `Filters`
- Returns the helper class for interacting with filters.
* - `Player.guild`
- `Guild`
- Returns the guild associated with the player.
* - `Player.is_connected`
- `bool`
- Returns whether or not the player is connected.
* - `Player.is_dead`
- `bool`
- Returns whether the player is dead or not. A player is considered dead if it has been destroyed and removed from stored players.
* - `Player.is_paused`
- `bool`
- Returns whether or not the player has a track which is paused or not.
* - `Player.is_playing`
- `bool`
- Returns whether or not the player is actively playing a track.
* - `Player.node`
- `Node`
- Returns the node the player is connected to.
* - `Player.position`
- `float`
- Returns the players position in a track in milliseconds.
* - `Player.volume`
- `int`
- Returns the players current volume.
:::
## Getting tracks
To get tracks using Lavalink, we need to use `Player.get_tracks()`
You can also use `Node.get_tracks()` to do the same thing but without having a player.
```py
await Player.get_tracks(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `query`
- `str`
- The string you want to search up
* - `ctx`
- `Optional[commands.Context]`
- Optional value which sets a `Context` object on the tracks you search.
* - `search_type`
- `SearchType`
- Enum which sets the provider to search from. Default value is `SearchType.ytsearch`
* - `filters`
- `Optional[List[Filter]]`
- Optional value which sets the filters that should apply when the track is played on the tracks you search.
:::
After you set those parameters, your function should look something like this:
```py
await Player.get_tracks(
query="<your query here>",
ctx=<optional ctx object here>,
search_type=<optional search type here>,
filters=[<optional filters here>]
)
```
:::{important}
All querying of Spotify and Apple Music tracks or playlists is handled in this function if you enabled that functionality when creating your node.
If you want to enable it, refer to [](pool.md#adding-a-node)
:::
You should get a list of `Track` in return after running this function for you to then do whatever you want with it.
Ideally, you should be putting all tracks into some sort of a queue. If you would like to learn about how to use
our queue implementation, you can refer to [](queue.md)
## Getting recommendations
To get recommendations using Lavalink, we need to use `Player.get_recommendations()`
You can also use `Node.get_recommendations()` to do the same thing without having a player.
```py
await Player.get_recommendations(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `track`
- `Track`
- The track to fetch recommendations for
* - `ctx`
- `Optional[commands.Context]`
- Optional value which sets a `Context` object on the recommendations you fetch.
:::
After you set those parameters, your function should look something like this:
```py
await Player.get_recommendations(
track=<your track object here>,
ctx=<optional ctx object here>,
)
```
You should get a list of `Track` in return after running this function for you to then do whatever you want with it.
Ideally, you should be putting all tracks into some sort of a queue. If you would like to learn about how to use
our queue implementation, you can refer to [](queue.md)
## Connecting a player
To connect a player to a channel you need to pass the `Player` class into your `channel.connect()` function:
```py
await voice_channel.connect(cls=Player)
```
This will instance the player and make it available to your guild. If you want to access your player after instancing it,
you must use either `Guild.voice_client` or `Context.voice_client`.
## Controlling the player
There are a few functions to control the player:
- `Player.destroy()`
- `Player.play()`
- `Player.seek()`
- `Player.set_pause()`
- `Player.set_volume()`
- `Player.stop()`
### Destroying a player
To destroy a player, we need to use `Player.destroy()`
```py
await Player.destroy()
```
### Playing a track
To play a track, we need to use `Player.play()`
```py
await Player.play(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `track`
- `Track`
- The track to play
* - `start`
- `int`
- The time (in milliseconds) to start the track at. Default value is `0`
* - `end`
- `int`
- The time (in milliseconds) to end the track at. Default value is `0`
* - `ignore_if_playing`
- `bool`
- If set, ignores the current track playing and replaces it with this track. Default value is `False`
:::
After you set those parameters, your function should look something like this:
```py
await Player.play(
track=<your track object here>,
start=<your optional start time here>,
end=<your optional end time here>,
ignore_if_playing=<your optional boolean here>
)
```
After running this function, it should return the `Track` you specified when running the function. This means the track is now playing.
### Seeking to a position
To seek to a position, we need to use `Player.seek()`
```py
await Player.seek(...)
```
After you have initialized your function, we need to include the `position` parameter, which is an amount in milliseconds:
```py
await Player.seek(position=<your pos here>)
```
After running this function, your currently playing track should seek to your specified position
### Pausing/unpausing the player
To pause/unpause the player, we need to use `Player.set_pause()`
```py
await Player.set_pause(...)
```
After you have initialized your function, we need to include the `pause` parameter, which is a boolean:
```py
await Player.set_pause(pause=<True/False>)
```
After running this function, your currently playing track should either pause or unpause depending on what you set.
### Setting the player volume
To set the volume the player, we need to use `Player.set_volume()`
```py
await Player.set_volume(...)
```
:::{important}
Lavalink accept ranges from 0 to 500 for this parameter. Inputting a value either higher or lower
than this amount will **not work.**
:::
After you have initialized your function, we need to include the `amount` parameter, which is an integer:
```py
await Player.set_volume(amount=<int>)
```
After running this function, your currently playing track should adjust in volume depending on the amount you set.
### Stopping the player
To stop the player, we need to use `Player.stop()`
```py
await Player.stop()
```
## Controlling filters
Pomice has an extensive suite of filter management tools to help you make the most of Lavalink and it's filters.
Here are some of the functions you will be using to control filters:
- `Player.add_filter()`
- `Player.remove_filter()`
- `Player.reset_filters()`
### Adding a filter
To add a filter, we need to use `Player.add_filter()`
```py
await Player.add_filter(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `filter`
- `Filter`
- The filter to apply
* - `fast_apply`
- `bool`
- If set to `True`, the specified filter will apply (almost) instantly if a song is playing. Default value is `False`.
:::
After you set those parameters, your function should look something like this:
```py
await Player.add_filter(
filter=<your filter object here>,
fast_apply=<True/False>
)
```
After running this function, you should see your currently playing track sound different depending on the filter you chose.

143
docs/hdi/pool.md Normal file
View File

@ -0,0 +1,143 @@
# Use the NodePool class
The `NodePool` class is the first class you will use when using Pomice.
The `NodePool` Class has three main functions you can use:
- `NodePool.create_node()`
- `NodePool.get_node()`
- `NodePool.get_best_node()`
## Adding a node
To add a node to our `NodePool`, we need to run `NodePool.create_node()`.
```py
await NodePool.create_node(...)
```
After you have initialized your function, we need to fill in the proper parameters:
:::{list-table}
:header-rows: 1
* - Name
- Type
- Description
* - `bot`
- `Client`
- A discord.py `Client` object (can be either a `Client` or a `commands.Bot`)
* - `host`
- `str`
- The IP/URL of your Lavalink node. Remember not to include the port in this field
* - `port`
- `int`
- The port your Lavalink node uses. By default, Lavalink uses `2333`.
* - `identifier`
- `str`
- The identifier your `Node` object uses to distinguish itself.
* - `password`
- `str`
- The password used to connect to your node.
* - `spotify_client_id`
- `Optional[str]`
- Your Spotify client ID goes here. You need this along with the client secret if you want to use Spotify functionality within Pomice.
* - `spotify_client_secret`
- `Optional[str]`
- Your Spotify client secret goes here. You need this along with the client ID if you want to use Spotify functionality within Pomice.
* - `apple_music`
- `bool`
- Set this value to `True` if you want to use Apple Music functionality within Pomice. Apple Music will **not work** if you don't enable this.
:::
All the other parameters not listed here have default values that are either set within the function or set later in the initialization of the node. If you would like to set these parameters to a different value, you are free to do so.
After you set those parameters, your function should look something like this:
```py
await NodePool.create_node(
bot=bot,
host="<your ip here>",
port=<your port here>,
identifier="<your id here>",
password="<your password here>",
spotify_client_id="<your spotify client id here>",
spotify_client_secret="<your spotify client secret here>"
apple_music=True
)
```
:::{important}
For features like Spotify and Apple Music, you are **not required** to fill in anything for them if you do not want to use them. If you do end up queuing a Spotify or Apple Music track anyway, they will **not work** because these options are not enabled.
:::
Now that you have your Node object created, move on to [Using a node](node.md) to see what you can do with your `Node` object.
## Getting a node
To get a node from the node pool, we need to use `NodePool.get_node()`
```py
await NodePool.get_node(...)
```
After you have initialized your function, you can specify a identifier if you want to grab a specified node:
```py
await NodePool.get_node(identifier="<your id here>")
```
If you do not set a identifier, it'll return a random node from the pool.
## Getting the best node
To get a node from the node pool based on certain requirements, we need to use `NodePool.get_best_node()`
```py
await NodePool.get_best_node(...)
```
After you have initialized your function, you need to specify a `NodeAlgorithm` to use to grab your node from the pool.
The available algorithms are `by_ping` and `by_players`.
If you want to view what they do, refer to the `NodeAlgorithm` enum in the [](../api/enums.md) section.
```py
await NodePool.get_best_node(algorithm=NodeAlgorithm.xyz)
```

1
docs/hdi/queue.md Normal file
View File

@ -0,0 +1 @@
# Use the Queue class

44
docs/index.md Normal file
View File

@ -0,0 +1,44 @@
---
hide-toc: true
---
# Pomice
![](https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg)
Pomice is a fully asynchronous Python library designed for communicating with [Lavalink](https://github.com/freyacodes/Lavalink) seamlessly within the [discord.py](https://github.com/Rapptz/discord.py) library. It features 100% API coverage of the entire [Lavalink](https://github.com/freyacodes/Lavalink) spec that can be accessed with easy-to-understand functions. We also include Spotify and Apple Music querying capabilites using built-in custom clients, making it easier to develop your next big music bot.
## Quick Links:
- [Installation](installation.md)
- [Quickstart](quickstart.md)
- [Frequently Asked Questions](faq.md)
- [How Do I?](hdi/index.md)
- [API Reference](api/index.md)
```{toctree}
:caption: Before You Start
:hidden:
installation
quickstart
faq
```
```{toctree}
:caption: How Do I?
:hidden:
hdi/index.md
```
```{toctree}
:caption: API Reference
:hidden:
api/index.md
```

View File

@ -1,112 +0,0 @@
.. pomice documentation master file, created by
sphinx-quickstart on Tue Nov 2 19:31:07 2021.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to Pomice!
==================
.. image:: https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg
The modern `Lavalink <https://github.com/freyacodes/Lavalink>`_ wrapper designed for `discord.py <https://github.com/Rapptz/discord.py>`_
Contents
---------
.. toctree::
modules
Before You Start
----------------
This library is designed to work with the Lavalink audio delivery system,
which directly interfaces with Discord to provide buttery smooth audio without
wasting your precious system resources.
Pomice is made with convenience to the user, in that everything is easy to use
and is out of your way, while also being customizable.
In order to start using this library, please download a Lavalink node to start,
you can get it `here <https://github.com/freyacodes/Lavalink/releases/latest>`_
Quick Jumpstart
----------------
If you want a quick example as to how to start with Pomice, look below:
.. code-block:: python3
import pomice
import discord
import re
from discord.ext import commands
URL_REG = re.compile(r'https?://(?:www\.)?.+')
class MyBot(commands.Bot):
def __init__(self) -> None:
super().__init__(command_prefix='!', activity=discord.Activity(type=discord.ActivityType.listening, name='to music!'))
self.add_cog(Music(self))
async def on_ready(self) -> None:
print("I'm online!")
await self.cogs["Music"].start_nodes()
class Music(commands.Cog):
def __init__(self, bot) -> None:
self.bot = bot
self.pomice = pomice.NodePool()
async def start_nodes(self):
await self.pomice.create_node(bot=self.bot, host='127.0.0.1', port='3030',
password='youshallnotpass', identifier='MAIN')
print(f"Node is ready!")
@commands.command(name='join', aliases=['connect'])
async def join(self, ctx: commands.Context, *, channel: discord.TextChannel = None) -> None:
if not channel:
channel = getattr(ctx.author.voice, 'channel', None)
if not channel:
raise commands.CheckFailure('You must be in a voice channel to use this command'
'without specifying the channel argument.')
await ctx.author.voice.channel.connect(cls=pomice.Player)
await ctx.send(f'Joined the voice channel `{channel}`')
@commands.command(name='play')
async def play(self, ctx, *, search: str) -> None:
if not ctx.voice_client:
await ctx.invoke(self.join)
player = ctx.voice_client
results = await player.get_tracks(query=f'{search}')
if not results:
raise commands.CommandError('No results were found for that search term.')
if isinstance(results, pomice.Playlist):
await player.play(track=results.tracks[0])
else:
await player.play(track=results[0])
bot = MyBot()
bot.run("token here")

30
docs/installation.md Normal file
View File

@ -0,0 +1,30 @@
# Installation
This library is designed to work with the Lavalink audio delivery system,
which directly interfaces with Discord to provide buttery smooth audio without
wasting your precious system resources.
Pomice is made with convenience to the user, in that everything is easy to use
and is out of your way, while also being customizable.
In order to start using this library, please download a Lavalink node to start,
you can get it [here](https://github.com/freyacodes/Lavalink/releases/latest)
After you have your Lavalink node set up, you can install Pomice:
```
pip install pomice
```
Pomice will handle installing all required dependencies for you so you can
start coding with it without a hitch.
After you installed Pomice, get familiar with how it works by starting out with [an example.](quickstart.md)
If you need more than just a quick example, get our drop-in [advanced cog](https://github.com/cloudwithax/pomice/blob/main/examples/advanced.py)
to take advantage of all of Pomice's features.
You are free to use this as a base to add on to for any music features you want to implement within your application.
If you want to use anything outside the provided examples, refer to the [API Reference](api/index.md) section.

View File

@ -1,4 +0,0 @@
.. toctree::
:maxdepth: 4
pomice

View File

@ -1,77 +0,0 @@
Pomice
==============
Enums
-------------------
.. automodule:: pomice.enums
:members:
:undoc-members:
:show-inheritance:
Events
--------------------
.. automodule:: pomice.events
:members:
:undoc-members:
:show-inheritance:
Exceptions
------------------------
.. automodule:: pomice.exceptions
:members:
:undoc-members:
:show-inheritance:
Filters
---------------------
.. automodule:: pomice.filters
:members:
:undoc-members:
:show-inheritance:
Objects
---------------------
.. automodule:: pomice.objects
:members:
:undoc-members:
:show-inheritance:
Player
--------------------
.. automodule:: pomice.player
:members:
:undoc-members:
:show-inheritance:
Pool
------------------
.. automodule:: pomice.pool
:members:
:undoc-members:
:show-inheritance:
Queue
------------------
.. automodule:: pomice.queue
:members:
:undoc-members:
:show-inheritance:
Utils
-------------------
.. automodule:: pomice.utils
:members:
:undoc-members:
:show-inheritance:

75
docs/quickstart.md Normal file
View File

@ -0,0 +1,75 @@
# Quick Jumpstart
If you want a quick example as to how to start with Pomice, look below:
```py
import pomice
import discord
import re
from discord.ext import commands
URL_REG = re.compile(r'https?://(?:www\.)?.+')
class MyBot(commands.Bot):
def __init__(self) -> None:
super().__init__(command_prefix='!', activity=discord.Activity(type=discord.ActivityType.listening, name='to music!'))
self.add_cog(Music(self))
async def on_ready(self) -> None:
print("I'm online!")
await self.cogs["Music"].start_nodes()
class Music(commands.Cog):
def __init__(self, bot) -> None:
self.bot = bot
self.pomice = pomice.NodePool()
async def start_nodes(self):
await self.pomice.create_node(bot=self.bot, host='127.0.0.1', port='3030',
password='youshallnotpass', identifier='MAIN')
print(f"Node is ready!")
@commands.command(name='join', aliases=['connect'])
async def join(self, ctx: commands.Context, *, channel: discord.TextChannel = None) -> None:
if not channel:
channel = getattr(ctx.author.voice, 'channel', None)
if not channel:
raise commands.CheckFailure('You must be in a voice channel to use this command'
'without specifying the channel argument.')
await ctx.author.voice.channel.connect(cls=pomice.Player)
await ctx.send(f'Joined the voice channel `{channel}`')
@commands.command(name='play')
async def play(self, ctx, *, search: str) -> None:
if not ctx.voice_client:
await ctx.invoke(self.join)
player = ctx.voice_client
results = await player.get_tracks(query=f'{search}')
if not results:
raise commands.CommandError('No results were found for that search term.')
if isinstance(results, pomice.Playlist):
await player.play(track=results.tracks[0])
else:
await player.play(track=results[0])
bot = MyBot()
bot.run("token here")
```

View File

@ -1,3 +1,5 @@
discord.py[voice]
aiohttp
orjson
myst_parser
furo