diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index f1dc5b0cd..ef2d440ba 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -16,7 +16,6 @@ redbot/core/drivers/* @tekulvw
redbot/core/events.py @tekulvw
redbot/core/global_checks.py @tekulvw
redbot/core/i18n.py @tekulvw
-redbot/core/json_io.py @tekulvw
redbot/core/modlog.py @palmtree5
redbot/core/rpc.py @tekulvw
redbot/core/utils/chat_formatting.py @tekulvw
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index d7dedc705..292dcd86f 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -11,8 +11,9 @@
* [4.4 Make](#44-make)
* [4.5 Keeping your dependencies up to date](#45-keeping-your-dependencies-up-to-date)
* [4.6 To contribute changes](#46-to-contribute-changes)
- * [4.7 How To Report A Bug](#47-how-to-report-a-bug)
- * [4.8 How To Suggest A Feature Or Enhancement](#48-how-to-suggest-a-feature-or-enhancement)
+ * [4.7 Using towncrier](#47-using-towncrier)
+ * [4.8 How To Report A Bug](#48-how-to-report-a-bug)
+ * [4.9 How To Suggest A Feature Or Enhancement](#49-how-to-suggest-a-feature-or-enhancement)
* [5. Code Review Process](#5-code-review-process)
* [5.1 Issues](#51-issues)
* [5.2 Pull Requests](#52-pull-requests)
@@ -56,24 +57,27 @@ The following requirements must be installed prior to setting up:
- Python 3.7.0 or greater
- git
- pip
- - pipenv
-If you're not on Windows, you can optionally install [pyenv](https://github.com/pyenv/pyenv), which will help you run tests for different python versions.
+If you're not on Windows, you should also have GNU make installed, and you can optionally install [pyenv](https://github.com/pyenv/pyenv), which can help you run tests for different python versions.
1. Fork and clone the repository to a directory on your local machine.
-2. Open a command line in that directory and execute the following commands:
+2. Open a command line in that directory and execute the following command:
```bash
- pip install pipenv
- pipenv install --dev
+ make newenv
```
- Red, its dependencies, and all required development tools, are now installed to a virtual environment. Red is installed in editable mode, meaning that edits you make to the source code in the repository will be reflected when you run Red.
-3. Activate the new virtual environment with the command:
- ```bash
- pipenv shell
- ```
- From here onwards, we will assume you are executing commands from within this shell. Each time you open a new command line, you should execute this command first.
+ Red, its dependencies, and all required development tools, are now installed to a virtual environment located in the `.venv` subdirectory. Red is installed in editable mode, meaning that edits you make to the source code in the repository will be reflected when you run Red.
+3. Activate the new virtual environment with one of the following commands:
+ - Posix:
+ ```bash
+ source .venv/bin/activate
+ ```
+ - Windows:
+ ```powershell
+ .venv\Scripts\activate
+ ```
+ Each time you open a new command line, you should execute this command first. From here onwards, we will assume you are executing commands from within this activated virtual environment.
-Note: If you haven't used `pipenv` before but are comfortable with virtualenvs, just run `pip install pipenv` in the virtualenv you're already using and invoke the command above from the cloned Red repo. It will do the correct thing.
+**Note:** If you're comfortable with setting up virtual environments yourself and would rather do it manually, just run `pip install -Ur tools/dev-requirements.txt` after setting it up.
### 4.2 Testing
We've recently started using [tox](https://github.com/tox-dev/tox) to run all of our tests. It's extremely simple to use, and if you followed the previous section correctly, it is already installed to your virtual environment.
@@ -95,25 +99,57 @@ Our style checker of choice, [black](https://github.com/ambv/black), actually ha
Use the command `black --help` to see how to use this tool. The full style guide is explained in detail on [black's GitHub repository](https://github.com/ambv/black). **There is one exception to this**, however, which is that we set the line length to 99, instead of black's default 88. When using `black` on the command line, simply use it like so: `black -l 99 -N `.
### 4.4 Make
-You may have noticed we have a `Makefile` and a `make.bat` in the top-level directory. For now, you can do two things with them:
+You may have noticed we have a `Makefile` and a `make.bat` in the top-level directory. For now, you can do a few things with them:
1. `make reformat`: Reformat all python files in the project with Black
2. `make stylecheck`: Check if any `.py` files in the project need reformatting
+3. `make newenv`: Set up a new virtual environment in the `.venv` subdirectory, and install Red and its dependencies. If one already exists, it is cleared out and replaced.
+4. `make syncenv`: Sync your environment with Red's latest dependencies.
+
+The other make recipes are most likely for project maintainers rather than contributors.
+
+You can specify the Python executable used in the make recipes with the `PYTHON` environment variable, e.g. `make PYTHON=/usr/bin/python3.7 newenv`.
### 4.5 Keeping your dependencies up to date
-Whenever you pull from upstream (V3/develop on the main repository) and you notice the file `Pipfile.lock` has been changed, it usually means one of the package dependencies have been updated, added or removed. To make sure you're testing and formatting with the most up-to-date versions of our dependencies, run `pipenv install --dev` again.
+Whenever you pull from upstream (V3/develop on the main repository) and you notice either of the files `setup.cfg` or `tools/dev-requirements.txt` have been changed, it can often mean some package dependencies have been updated, added or removed. To make sure you're testing and formatting with the most up-to-date versions of our dependencies, run `make syncenv`. You could also simply do `make newenv` to install them to a clean new virtual environment.
### 4.6 To contribute changes
1. Create a new branch on your fork
2. Make the changes
3. If you like the changes and think the main Red project could use it:
+ * Create a towncrier entry for the changes. (See next section for details)
* Run tests with `tox` to ensure your code is up to scratch
* Create a Pull Request on GitHub with your changes
-### 4.7 How To Report A Bug
+### 4.7 Using towncrier
+
+Red uses towncrier to create changelogs.
+
+To create a towncrier entry for your PR, create a file in `changelog.d` for it. If the changes are for a specific cog, place the file in the related subdirectory.
+
+The filename should be of the format `issuenumber.changetype(.count).rst`, where `(.count)` is an optional
+part of the filename should multiple entries for the same issue number and type be necessary.
+If there is not an issue associated with your PR,
+you may use the PR number in place of the issue number.
+
+Valid changetypes are:
+
+ * breaking : Breaking changes
+ * dep : Changes to dependencies
+ * enhance : Enhancements
+ * feature : New features
+ * bugfix : Bugfixes
+ * docs : documentation improvements and additions
+ * removal : removal of something
+ * misc : any changes which don't have a user facing change, and don't belong in the changelog for users
+
+The contents of the file should be a short, human readable description of the impact of the changes made,
+not the technical details of the change.
+
+### 4.8 How To Report A Bug
Please see our **ISSUES.MD** for more information.
-### 4.8 How To Suggest A Feature Or Enhancement
+### 4.9 How To Suggest A Feature Or Enhancement
The goal of Red is to be as useful to as many people as possible, this means that all features must be useful to anyone and any server that uses Red.
If you find yourself wanting a feature that Red does not already have, you're probably not alone. There's bound to be a great number of users out there needing the same thing and a lot of the features that Red has today have been added because of the needs of our users. Open an issue on our issues list and describe the feature you would like to see, how you would use it, how it should work, and why it would be useful to the Red community as a whole.
@@ -132,7 +168,7 @@ Pull requests are evaluated by their quality and how effectively they solve thei
1. A pull request is submitted
2. Core team members will review and test the pull request (usually within a week)
-3. After a majority of the core team approves your pull request:
+3. After a member of the core team approves your pull request:
* If your pull request is considered an improvement or enhancement the project owner will have 1 day to veto or approve your pull request.
* If your pull request is considered a new feature the project owner will have 1 week to veto or approve your pull request.
4. If any feedback is given we expect a response within 1 week or we may decide to close the PR.
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..45ab9faf9
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+patreon: Red_Devs
diff --git a/.gitignore b/.gitignore
index 61f2eb923..7f45b422d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,8 @@
*.pot
.data
!/tests/cogs/dataconverter/data/**/*.json
+Pipfile
+Pipfile.lock
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
@@ -55,6 +57,7 @@ parts/
sdist/
var/
wheels/
+pip-wheel-metadata/
*.egg-info/
.installed.cfg
*.egg
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 000000000..1e870ede1
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,148 @@
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=pytest
+
+# Pickle collected data for later comparisons.
+persistent=no
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# DO NOT CHANGE THIS VALUE # Use multiple processes to speed up Pylint.
+jobs=1
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code
+extension-pkg-whitelist=
+
+# Allow optimization of some AST trees. This will activate a peephole AST
+# optimizer, which will apply various small optimizations. For instance, it can
+# be used to obtain the result of joining multiple strings with the addition
+# operator. Joining a lot of strings can lead to a maximum recursion error in
+# Pylint and this flag can prevent that. It has one side effect, the resulting
+# AST will be different than the one from reality.
+optimize-ast=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time. See also the "--disable" option for examples.
+
+
+enable=all
+
+disable=C, # black is enforcing this for us already, incompatibly
+ W, # unbroaden this to the below specifics later on.
+ W0107, # uneccessary pass is stylisitc in most places
+ W0212, # Should likely refactor around protected access warnings later
+ W1203, # fstrings are too fast to care about enforcing this.
+ W0612, # unused vars can sometimes indicate an issue, but ...
+ W1401, # Should probably fix the reason this is disabled (start up screen)
+ W0511, # Nope, todos are fine for future people to see things to do.
+ W0613, # Too many places where we need to take unused args do to d.py ... also menus
+ W0221, # Overriden converters.
+ W0223, # abstractmethod not defined in mixins is expected
+ I, # ...
+ R # While some of these have merit, It's too large a burden to enable this right now.
+
+
+[REPORTS]
+
+output-format=parseable
+files-output=no
+reports=no
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging
+
+
+[TYPECHECK]
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# TODO: Write a plyint plugin to allow this with these mixin classes
+# To use the abstractmethod we know will be defined in the final class.
+ignored-classes=redbot.cogs.mod.movetocore.MoveToCore,
+ redbot.cogs.mod.kickban.KickBanMixin,
+ redbot.cogs.mod.mutes.MuteMixin,
+ redbot.cogs.mod.names.ModInfo,
+ redbot.cogs.mod.settings.ModSettings,
+ redbot.cogs.mod.events.Events
+
+ignored-modules=distutils # https://github.com/PyCQA/pylint/issues/73
+
+
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=_$|dummy
+
+
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=no
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,__call__
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception,discord.DiscordException
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 66a386d16..a1748288b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,14 +5,10 @@ notifications:
email: false
python:
-- 3.7.2
+- 3.7.3
env:
global:
- PIPENV_IGNORE_VIRTUALENVS=1
- matrix:
- - TOXENV=py
- - TOXENV=docs
- - TOXENV=style
install:
- pip install --upgrade pip tox
@@ -22,6 +18,19 @@ script:
jobs:
include:
+ - env: TOXENV=py
+ - env: TOXENV=docs
+ - env: TOXENV=style
+ - env: TOXENV=postgres
+ services: postgresql
+ addons:
+ postgresql: "10"
+ before_script:
+ - psql -c 'create database red_db;' -U postgres
+ - env: TOXENV=mongo
+ services: mongodb
+ before_script:
+ - mongo red_db --eval 'db.createUser({user:"red",pwd:"red",roles:["readWrite"]});'
# These jobs only occur on tag creation if the prior ones succeed
- stage: PyPi Deployment
if: tag IS present
@@ -50,7 +59,7 @@ jobs:
- echo "deb https://artifacts.crowdin.com/repo/deb/ /" | sudo tee -a /etc/apt/sources.list
- sudo apt-get update -qq
- sudo apt-get install -y crowdin
- - pip install redgettext==2.2
+ - pip install redgettext==3.1
deploy:
- provider: script
script: make upload_translations
diff --git a/Makefile b/Makefile
index 46de7da9f..7ae79fedd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,33 @@
+PYTHON ?= python3.7
+
# Python Code Style
reformat:
- black -l 99 `git ls-files "*.py"`
+ $(PYTHON) -m black -l 99 --target-version py37 `git ls-files "*.py"`
stylecheck:
- black --check -l 99 `git ls-files "*.py"`
+ $(PYTHON) -m black --check -l 99 --target-version py37 `git ls-files "*.py"`
# Translations
gettext:
- redgettext --command-docstrings --verbose --recursive redbot --exclude-files "redbot/pytest/**/*"
+ $(PYTHON) -m redgettext --command-docstrings --verbose --recursive redbot --exclude-files "redbot/pytest/**/*"
upload_translations:
$(MAKE) gettext
crowdin upload sources
download_translations:
crowdin download
+
+# Dependencies
+bumpdeps:
+ $(PYTHON) tools/bumpdeps.py
+
+# Development environment
+newenv:
+ $(PYTHON) -m venv --clear .venv
+ .venv/bin/pip install -U pip setuptools
+ $(MAKE) syncenv
+syncenv:
+ .venv/bin/pip install -Ur ./tools/dev-requirements.txt
+
+# Changelog check
+checkchangelog:
+ bash tools/check_changelog_entries.sh
+ $(PYTHON) -m towncrier --draft
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index da8fd1aad..000000000
--- a/Pipfile
+++ /dev/null
@@ -1,11 +0,0 @@
-[[source]]
-url = "https://pypi.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-red-discordbot = {path = ".",editable = true,extras = ['mongo']}
-
-[dev-packages]
-tox = "*"
-red-discordbot = {path = ".",editable = true,extras = ['docs', 'test', 'style', 'mongo']}
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index 9a259f509..000000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,885 +0,0 @@
-{
- "_meta": {
- "hash": {
- "sha256": "d71d118bb7fd8ed744bd9f98d3b9f22ccb589d1c45cd92ea2cbd721446fe6002"
- },
- "pipfile-spec": 6,
- "requires": {},
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "aiohttp": {
- "hashes": [
- "sha256:00d198585474299c9c3b4f1d5de1a576cc230d562abc5e4a0e81d71a20a6ca55",
- "sha256:0155af66de8c21b8dba4992aaeeabf55503caefae00067a3b1139f86d0ec50ed",
- "sha256:09654a9eca62d1bd6d64aa44db2498f60a5c1e0ac4750953fdd79d5c88955e10",
- "sha256:199f1d106e2b44b6dacdf6f9245493c7d716b01d0b7fbe1959318ba4dc64d1f5",
- "sha256:296f30dedc9f4b9e7a301e5cc963012264112d78a1d3094cd83ef148fdf33ca1",
- "sha256:368ed312550bd663ce84dc4b032a962fcb3c7cae099dbbd48663afc305e3b939",
- "sha256:40d7ea570b88db017c51392349cf99b7aefaaddd19d2c78368aeb0bddde9d390",
- "sha256:629102a193162e37102c50713e2e31dc9a2fe7ac5e481da83e5bb3c0cee700aa",
- "sha256:6d5ec9b8948c3d957e75ea14d41e9330e1ac3fed24ec53766c780f82805140dc",
- "sha256:87331d1d6810214085a50749160196391a712a13336cd02ce1c3ea3d05bcf8d5",
- "sha256:9a02a04bbe581c8605ac423ba3a74999ec9d8bce7ae37977a3d38680f5780b6d",
- "sha256:9c4c83f4fa1938377da32bc2d59379025ceeee8e24b89f72fcbccd8ca22dc9bf",
- "sha256:9cddaff94c0135ee627213ac6ca6d05724bfe6e7a356e5e09ec57bd3249510f6",
- "sha256:a25237abf327530d9561ef751eef9511ab56fd9431023ca6f4803f1994104d72",
- "sha256:a5cbd7157b0e383738b8e29d6e556fde8726823dae0e348952a61742b21aeb12",
- "sha256:a97a516e02b726e089cffcde2eea0d3258450389bbac48cbe89e0f0b6e7b0366",
- "sha256:acc89b29b5f4e2332d65cd1b7d10c609a75b88ef8925d487a611ca788432dfa4",
- "sha256:b05bd85cc99b06740aad3629c2585bda7b83bd86e080b44ba47faf905fdf1300",
- "sha256:c2bec436a2b5dafe5eaeb297c03711074d46b6eb236d002c13c42f25c4a8ce9d",
- "sha256:cc619d974c8c11fe84527e4b5e1c07238799a8c29ea1c1285149170524ba9303",
- "sha256:d4392defd4648badaa42b3e101080ae3313e8f4787cb517efd3f5b8157eaefd6",
- "sha256:e1c3c582ee11af7f63a34a46f0448fca58e59889396ffdae1f482085061a2889"
- ],
- "version": "==3.5.4"
- },
- "aiohttp-json-rpc": {
- "hashes": [
- "sha256:14656d360211bcdb686be0c099f7a99d8c2ae8e2762b113e6df408a8f275323f",
- "sha256:9aa8a897fbe32b343ce7b14121491cc200395161316ca1296c6fab28449886bf"
- ],
- "version": "==0.12.1"
- },
- "appdirs": {
- "hashes": [
- "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92",
- "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"
- ],
- "version": "==1.4.3"
- },
- "async-timeout": {
- "hashes": [
- "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f",
- "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"
- ],
- "version": "==3.0.1"
- },
- "attrs": {
- "hashes": [
- "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69",
- "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb"
- ],
- "version": "==18.2.0"
- },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
- ],
- "version": "==3.0.4"
- },
- "click": {
- "hashes": [
- "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
- "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
- ],
- "version": "==7.0"
- },
- "colorama": {
- "hashes": [
- "sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d",
- "sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"
- ],
- "version": "==0.4.1"
- },
- "discord.py": {
- "hashes": [
- "sha256:173b5e2fea2e012bbe964e87e92826ccaf97056bba539a7caec988f329acca04",
- "sha256:7cb420731fe9c8d820401f3290957433a10169816d08805f826042941d25928e"
- ],
- "version": "==1.0.1"
- },
- "distro": {
- "hashes": [
- "sha256:362dde65d846d23baee4b5c058c8586f219b5a54be1cf5fc6ff55c4578392f57",
- "sha256:eedf82a470ebe7d010f1872c17237c79ab04097948800029994fa458e52fb4b4"
- ],
- "version": "==1.4.0"
- },
- "dnspython": {
- "hashes": [
- "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01",
- "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"
- ],
- "version": "==1.16.0"
- },
- "fuzzywuzzy": {
- "hashes": [
- "sha256:5ac7c0b3f4658d2743aa17da53a55598144edbc5bee3c6863840636e6926f254",
- "sha256:6f49de47db00e1c71d40ad16da42284ac357936fa9b66bea1df63fed07122d62"
- ],
- "version": "==0.17.0"
- },
- "idna": {
- "hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
- ],
- "version": "==2.8"
- },
- "idna-ssl": {
- "hashes": [
- "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"
- ],
- "version": "==1.1.0"
- },
- "motor": {
- "hashes": [
- "sha256:462fbb824f4289481c158227a2579d6adaf1ec7c70cf7ebe60ed6ceb321e5869",
- "sha256:d035c09ab422bc50bf3efb134f7405694cae76268545bd21e14fb22e2638f84e"
- ],
- "version": "==2.0.0"
- },
- "multidict": {
- "hashes": [
- "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f",
- "sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3",
- "sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef",
- "sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b",
- "sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73",
- "sha256:148ff60e0fffa2f5fad2eb25aae7bef23d8f3b8bdaf947a65cdbe84a978092bc",
- "sha256:1d1c77013a259971a72ddaa83b9f42c80a93ff12df6a4723be99d858fa30bee3",
- "sha256:1d48bc124a6b7a55006d97917f695effa9725d05abe8ee78fd60d6588b8344cd",
- "sha256:31dfa2fc323097f8ad7acd41aa38d7c614dd1960ac6681745b6da124093dc351",
- "sha256:34f82db7f80c49f38b032c5abb605c458bac997a6c3142e0d6c130be6fb2b941",
- "sha256:3d5dd8e5998fb4ace04789d1d008e2bb532de501218519d70bb672c4c5a2fc5d",
- "sha256:4a6ae52bd3ee41ee0f3acf4c60ceb3f44e0e3bc52ab7da1c2b2aa6703363a3d1",
- "sha256:4b02a3b2a2f01d0490dd39321c74273fed0568568ea0e7ea23e02bd1fb10a10b",
- "sha256:4b843f8e1dd6a3195679d9838eb4670222e8b8d01bc36c9894d6c3538316fa0a",
- "sha256:5de53a28f40ef3c4fd57aeab6b590c2c663de87a5af76136ced519923d3efbb3",
- "sha256:61b2b33ede821b94fa99ce0b09c9ece049c7067a33b279f343adfe35108a4ea7",
- "sha256:6a3a9b0f45fd75dc05d8e93dc21b18fc1670135ec9544d1ad4acbcf6b86781d0",
- "sha256:76ad8e4c69dadbb31bad17c16baee61c0d1a4a73bed2590b741b2e1a46d3edd0",
- "sha256:7ba19b777dc00194d1b473180d4ca89a054dd18de27d0ee2e42a103ec9b7d014",
- "sha256:7c1b7eab7a49aa96f3db1f716f0113a8a2e93c7375dd3d5d21c4941f1405c9c5",
- "sha256:7fc0eee3046041387cbace9314926aa48b681202f8897f8bff3809967a049036",
- "sha256:8ccd1c5fff1aa1427100ce188557fc31f1e0a383ad8ec42c559aabd4ff08802d",
- "sha256:8e08dd76de80539d613654915a2f5196dbccc67448df291e69a88712ea21e24a",
- "sha256:c18498c50c59263841862ea0501da9f2b3659c00db54abfbf823a80787fde8ce",
- "sha256:c49db89d602c24928e68c0d510f4fcf8989d77defd01c973d6cbe27e684833b1",
- "sha256:ce20044d0317649ddbb4e54dab3c1bcc7483c78c27d3f58ab3d0c7e6bc60d26a",
- "sha256:d1071414dd06ca2eafa90c85a079169bfeb0e5f57fd0b45d44c092546fcd6fd9",
- "sha256:d3be11ac43ab1a3e979dac80843b42226d5d3cccd3986f2e03152720a4297cd7",
- "sha256:db603a1c235d110c860d5f39988ebc8218ee028f07a7cbc056ba6424372ca31b"
- ],
- "version": "==4.5.2"
- },
- "pymongo": {
- "hashes": [
- "sha256:025f94fc1e1364f00e50badc88c47f98af20012f23317234e51a11333ef986e6",
- "sha256:02aa7fb282606331aefbc0586e2cf540e9dbe5e343493295e7f390936ad2738e",
- "sha256:057210e831573e932702cf332012ed39da78edf0f02d24a3f0b213264a87a397",
- "sha256:0d946b79c56187fe139276d4c8ed612a27a616966c8b9779d6b79e2053587c8b",
- "sha256:104790893b928d310aae8a955e0bdbaa442fb0ac0a33d1bbb0741c791a407778",
- "sha256:15527ef218d95a8717486106553b0d54ff2641e795b65668754e17ab9ca6e381",
- "sha256:1826527a0b032f6e20e7ac7f72d7c26dd476a5e5aa82c04aa1c7088a59fded7d",
- "sha256:22e3aa4ce1c3eebc7f70f9ca7fd4ce1ea33e8bdb7b61996806cd312f08f84a3a",
- "sha256:244e1101e9a48615b9a16cbd194f73c115fdfefc96894803158608115f703b26",
- "sha256:24b8c04fdb633a84829d03909752c385faef249c06114cc8d8e1700b95aae5c8",
- "sha256:2c276696350785d3104412cbe3ac70ab1e3a10c408e7b20599ee41403a3ed630",
- "sha256:2d8474dc833b1182b651b184ace997a7bd83de0f51244de988d3c30e49f07de3",
- "sha256:3119b57fe1d964781e91a53e81532c85ed1701baaddec592e22f6b77a9fdf3df",
- "sha256:3bee8e7e0709b0fcdaa498a3e513bde9ffc7cd09dbceb11e425bd91c89dbd5b6",
- "sha256:436c071e01a464753d30dbfc8768dd93aecf2a8e378e5314d130b95e77b4d612",
- "sha256:46635e3f19ad04d5a7d7cf23d232388ddbfccf46d9a3b7436b6abadda4e84813",
- "sha256:4772e0b679717e7ac4608d996f57b6f380748a919b457cb05bb941467b888b22",
- "sha256:4e2cd80e16f481a62c3175b607373200e714ed29025f21559ebf7524f295689f",
- "sha256:52732960efa0e003ca1c092dc0a3c65276e897681287a788a01ca78dda3b41f0",
- "sha256:55a7de51ec7d1731b2431886d0349146645f2816e5b8eb982d7c49f89472c9f3",
- "sha256:5f8ed5934197a2d4b2087646e98de3e099a237099dcf498b9e38dd3465f74ef4",
- "sha256:64b064124fcbc8eb04a155117dc4d9a336e3cda3f069958fbc44fe70c3c3d1e9",
- "sha256:65958b8e4319f992e85dad59d8081888b97fcdbde5f0d14bc28f2848b92d3ef1",
- "sha256:7683428862e20c6a790c19e64f8ccf487f613fbc83d47e3d532df9c81668d451",
- "sha256:78566d5570c75a127c2491e343dc006798a384f06be588fe9b0cbe5595711559",
- "sha256:7d1cb00c093dbf1d0b16ccf123e79dee3b82608e4a2a88947695f0460eef13ff",
- "sha256:8c74e2a9b594f7962c62cef7680a4cb92a96b4e6e3c2f970790da67cc0213a7e",
- "sha256:8e60aa7699170f55f4b0f56ee6f8415229777ac7e4b4b1aa41fc61eec08c1f1d",
- "sha256:9447b561529576d89d3bf973e5241a88cf76e45bd101963f5236888713dea774",
- "sha256:970055bfeb0be373f2f5299a3db8432444bad3bc2f198753ee6c2a3a781e0959",
- "sha256:a6344b8542e584e140dc3c651d68bde51270e79490aa9320f9e708f9b2c39bd5",
- "sha256:ce309ca470d747b02ba6069d286a17b7df8e9c94d10d727d9cf3a64e51d85184",
- "sha256:cfbd86ed4c2b2ac71bbdbcea6669bf295def7152e3722ddd9dda94ac7981f33d",
- "sha256:d7929c513732dff093481f4a0954ed5ff16816365842136b17caa0b4992e49d3"
- ],
- "version": "==3.7.2"
- },
- "python-levenshtein-wheels": {
- "hashes": [
- "sha256:0065529c8aec4c044468286177761857d36981ba6f7fdb62d7d5f7ffd143de5d",
- "sha256:016924a59d689f9f47d5f7b26b70f31e309255e8dd72602c91e93ceb752b9f92",
- "sha256:089d046ea7727e583233c71fef1046663ed67b96967063ae8ddc9f551e86a4fc",
- "sha256:0aea217eab612acd45dcc3424a2e8dbd977cc309f80359d0c01971f1e65b9a9b",
- "sha256:0beb91ad80b1573829066e5af36b80190c367be6e0a65292f073353b0388c7fc",
- "sha256:0fa2ca69ef803bc6037a8c919e2e8a17b55e94c9c9ffcb4c21befbb15a1d0f40",
- "sha256:11c77d0d74ab7f46f89a58ae9c2d67349ebc1ae3e18636627f9939d810167c31",
- "sha256:19a68716a322486ddffc8bf7e5cf44a82f7700b05a10658e6e7fc5c7ae92b13d",
- "sha256:19a95a01d28d63b042438ba860c4ace90362906a038fa77962ba33325d377d10",
- "sha256:1a61f3a51e00a3608659bbaabb3f27af37c9dbe84d843369061a3e45cf0d5103",
- "sha256:1c50aebebab403fb2dd415d70355446ac364dece502b0e2737a1a085bb9a4aa4",
- "sha256:1e51cdc123625a28709662d24ea0cb4cf6f991845e6054d9f803c78da1d6b08f",
- "sha256:1f0056d3216b0fe38f25c6f8ebc84bd9f6d34c55a7a9414341b674fb98961399",
- "sha256:228b59460e9a786e498bdfc8011838b89c6054650b115c86c9c819a055a793b0",
- "sha256:23020f9ff2cb3457a926dcc470b84f9bd5b7646bd8b8e06b915bdbbc905cb23f",
- "sha256:3e6bcca97a7ff4e720352b57ddc26380c0583dcdd4b791acef7b574ad58468a7",
- "sha256:3ed88f9e638da57647149115c34e0e120cae6f3d35eee7d77e22cc9c1d8eced3",
- "sha256:445bf7941cb1fa05d6c2a4a502ad4868a5cacd92e8eb77b2bd008cdda9d37c55",
- "sha256:4ba5e147d76d7ee884fd6eae461438b080bcc9f2c6eb9b576811e1bcfe8f808e",
- "sha256:4bb128b719c30f3b9feacfe71a338ae07d39dbffc077139416f3535c89f12362",
- "sha256:53c0c9964390368fd64460b690f168221c669766b193b7e80ae3950c2b9551f8",
- "sha256:57c4edef81611098d37176278f2b6a3712bf864eed313496d7d80504805896d1",
- "sha256:7f7283dfe50eac8a8cd9b777de9eb50b1edf7dbb46fc7cc9d9b0050d0c135021",
- "sha256:7f9759095b3fc825464a72b1cae95125e610eba3c70f91557754c32a0bf32ea2",
- "sha256:98727050ba70eb8d318ec8a8203531c20119347fc8f281102b097326812742ab",
- "sha256:ac9cdf044dcb9481c7da782db01b50c1f0e7cdd78c8507b963b6d072829c0263",
- "sha256:b679f951f842c38665aa54bea4d7403099131f71fac6d8584f893a731fe1266d",
- "sha256:b8c183dc4aa4e95dc5c373eedc3d205c176805835611fcfec5d9050736c695c4",
- "sha256:c2c76f483d05eddec60a5cd89e92385adef565a4f243b1d9a6abe2f6bd2a7c0a",
- "sha256:c388baa3c04272a7c585d3da24030c142353eb26eb531dd2681502e6be7d7a26",
- "sha256:cb0f2a711db665b5bf8697b5af3b9884bb1139385c5c12c2e472e4bbee62da99",
- "sha256:cbac984d7b36e75b440d1c8ff9d3425d778364a0cbc23f8943383d4decd35d5e",
- "sha256:f9084ed3b8997ad4353d124b903f2860a9695b9e080663276d9e58c32e293244"
- ],
- "version": "==0.13.1"
- },
- "pyyaml": {
- "hashes": [
- "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b",
- "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf",
- "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a",
- "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3",
- "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1",
- "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1",
- "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613",
- "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04",
- "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f",
- "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537",
- "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531"
- ],
- "version": "==3.13"
- },
- "red-discordbot": {
- "editable": true,
- "extras": [
- "mongo"
- ],
- "path": "."
- },
- "red-lavalink": {
- "hashes": [
- "sha256:2a2f469c1feb72c2604795053a8823757ace85ed752eaf573c1d0daba29d1180",
- "sha256:4bc685a5d89660875d07f50060bacc820e69a763a581ce69375c792e16df4081"
- ],
- "version": "==0.3.0"
- },
- "schema": {
- "hashes": [
- "sha256:d994b0dc4966000037b26898df638e3e2a694cc73636cb2050e652614a350687",
- "sha256:fa1a53fe5f3b6929725a4e81688c250f46838e25d8c1885a10a590c8c01a7b74"
- ],
- "version": "==0.6.8"
- },
- "websockets": {
- "hashes": [
- "sha256:0e2f7d6567838369af074f0ef4d0b802d19fa1fee135d864acc656ceefa33136",
- "sha256:2a16dac282b2fdae75178d0ed3d5b9bc3258dabfae50196cbb30578d84b6f6a6",
- "sha256:5a1fa6072405648cb5b3688e9ed3b94be683ce4a4e5723e6f5d34859dee495c1",
- "sha256:5c1f55a1274df9d6a37553fef8cff2958515438c58920897675c9bc70f5a0538",
- "sha256:669d1e46f165e0ad152ed8197f7edead22854a6c90419f544e0f234cc9dac6c4",
- "sha256:695e34c4dbea18d09ab2c258994a8bf6a09564e762655408241f6a14592d2908",
- "sha256:6b2e03d69afa8d20253455e67b64de1a82ff8612db105113cccec35d3f8429f0",
- "sha256:79ca7cdda7ad4e3663ea3c43bfa8637fc5d5604c7737f19a8964781abbd1148d",
- "sha256:7fd2dd9a856f72e6ed06f82facfce01d119b88457cd4b47b7ae501e8e11eba9c",
- "sha256:82c0354ac39379d836719a77ee360ef865377aa6fdead87909d50248d0f05f4d",
- "sha256:8f3b956d11c5b301206382726210dc1d3bee1a9ccf7aadf895aaf31f71c3716c",
- "sha256:91ec98640220ae05b34b79ee88abf27f97ef7c61cf525eec57ea8fcea9f7dddb",
- "sha256:952be9540d83dba815569d5cb5f31708801e0bbfc3a8c5aef1890b57ed7e58bf",
- "sha256:99ac266af38ba1b1fe13975aea01ac0e14bb5f3a3200d2c69f05385768b8568e",
- "sha256:9fa122e7adb24232247f8a89f2d9070bf64b7869daf93ac5e19546b409e47e96",
- "sha256:a0873eadc4b8ca93e2e848d490809e0123eea154aa44ecd0109c4d0171869584",
- "sha256:cb998bd4d93af46b8b49ecf5a72c0a98e5cc6d57fdca6527ba78ad89d6606484",
- "sha256:e02e57346f6a68523e3c43bbdf35dde5c440318d1f827208ae455f6a2ace446d",
- "sha256:e79a5a896bcee7fff24a788d72e5c69f13e61369d055f28113e71945a7eb1559",
- "sha256:ee55eb6bcf23ecc975e6b47c127c201b913598f38b6a300075f84eeef2d3baff",
- "sha256:f1414e6cbcea8d22843e7eafdfdfae3dd1aba41d1945f6ca66e4806c07c4f454"
- ],
- "version": "==6.0"
- },
- "yarl": {
- "hashes": [
- "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9",
- "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f",
- "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb",
- "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320",
- "sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842",
- "sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0",
- "sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829",
- "sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310",
- "sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4",
- "sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8",
- "sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1"
- ],
- "version": "==1.3.0"
- }
- },
- "develop": {
- "aiohttp": {
- "hashes": [
- "sha256:00d198585474299c9c3b4f1d5de1a576cc230d562abc5e4a0e81d71a20a6ca55",
- "sha256:0155af66de8c21b8dba4992aaeeabf55503caefae00067a3b1139f86d0ec50ed",
- "sha256:09654a9eca62d1bd6d64aa44db2498f60a5c1e0ac4750953fdd79d5c88955e10",
- "sha256:199f1d106e2b44b6dacdf6f9245493c7d716b01d0b7fbe1959318ba4dc64d1f5",
- "sha256:296f30dedc9f4b9e7a301e5cc963012264112d78a1d3094cd83ef148fdf33ca1",
- "sha256:368ed312550bd663ce84dc4b032a962fcb3c7cae099dbbd48663afc305e3b939",
- "sha256:40d7ea570b88db017c51392349cf99b7aefaaddd19d2c78368aeb0bddde9d390",
- "sha256:629102a193162e37102c50713e2e31dc9a2fe7ac5e481da83e5bb3c0cee700aa",
- "sha256:6d5ec9b8948c3d957e75ea14d41e9330e1ac3fed24ec53766c780f82805140dc",
- "sha256:87331d1d6810214085a50749160196391a712a13336cd02ce1c3ea3d05bcf8d5",
- "sha256:9a02a04bbe581c8605ac423ba3a74999ec9d8bce7ae37977a3d38680f5780b6d",
- "sha256:9c4c83f4fa1938377da32bc2d59379025ceeee8e24b89f72fcbccd8ca22dc9bf",
- "sha256:9cddaff94c0135ee627213ac6ca6d05724bfe6e7a356e5e09ec57bd3249510f6",
- "sha256:a25237abf327530d9561ef751eef9511ab56fd9431023ca6f4803f1994104d72",
- "sha256:a5cbd7157b0e383738b8e29d6e556fde8726823dae0e348952a61742b21aeb12",
- "sha256:a97a516e02b726e089cffcde2eea0d3258450389bbac48cbe89e0f0b6e7b0366",
- "sha256:acc89b29b5f4e2332d65cd1b7d10c609a75b88ef8925d487a611ca788432dfa4",
- "sha256:b05bd85cc99b06740aad3629c2585bda7b83bd86e080b44ba47faf905fdf1300",
- "sha256:c2bec436a2b5dafe5eaeb297c03711074d46b6eb236d002c13c42f25c4a8ce9d",
- "sha256:cc619d974c8c11fe84527e4b5e1c07238799a8c29ea1c1285149170524ba9303",
- "sha256:d4392defd4648badaa42b3e101080ae3313e8f4787cb517efd3f5b8157eaefd6",
- "sha256:e1c3c582ee11af7f63a34a46f0448fca58e59889396ffdae1f482085061a2889"
- ],
- "version": "==3.5.4"
- },
- "aiohttp-json-rpc": {
- "hashes": [
- "sha256:14656d360211bcdb686be0c099f7a99d8c2ae8e2762b113e6df408a8f275323f",
- "sha256:9aa8a897fbe32b343ce7b14121491cc200395161316ca1296c6fab28449886bf"
- ],
- "version": "==0.12.1"
- },
- "alabaster": {
- "hashes": [
- "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359",
- "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"
- ],
- "version": "==0.7.12"
- },
- "appdirs": {
- "hashes": [
- "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92",
- "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"
- ],
- "version": "==1.4.3"
- },
- "async-timeout": {
- "hashes": [
- "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f",
- "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"
- ],
- "version": "==3.0.1"
- },
- "atomicwrites": {
- "hashes": [
- "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4",
- "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"
- ],
- "version": "==1.3.0"
- },
- "attrs": {
- "hashes": [
- "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69",
- "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb"
- ],
- "version": "==18.2.0"
- },
- "babel": {
- "hashes": [
- "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669",
- "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23"
- ],
- "version": "==2.6.0"
- },
- "black": {
- "hashes": [
- "sha256:09a9dcb7c46ed496a9850b76e4e825d6049ecd38b611f1224857a79bd985a8cf",
- "sha256:68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c"
- ],
- "version": "==19.3b0"
- },
- "certifi": {
- "hashes": [
- "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7",
- "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033"
- ],
- "version": "==2018.11.29"
- },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
- ],
- "version": "==3.0.4"
- },
- "click": {
- "hashes": [
- "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
- "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
- ],
- "version": "==7.0"
- },
- "colorama": {
- "hashes": [
- "sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d",
- "sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"
- ],
- "version": "==0.4.1"
- },
- "discord.py": {
- "hashes": [
- "sha256:173b5e2fea2e012bbe964e87e92826ccaf97056bba539a7caec988f329acca04",
- "sha256:7cb420731fe9c8d820401f3290957433a10169816d08805f826042941d25928e"
- ],
- "version": "==1.0.1"
- },
- "distro": {
- "hashes": [
- "sha256:362dde65d846d23baee4b5c058c8586f219b5a54be1cf5fc6ff55c4578392f57",
- "sha256:eedf82a470ebe7d010f1872c17237c79ab04097948800029994fa458e52fb4b4"
- ],
- "version": "==1.4.0"
- },
- "dnspython": {
- "hashes": [
- "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01",
- "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"
- ],
- "version": "==1.16.0"
- },
- "docutils": {
- "hashes": [
- "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
- "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
- "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
- ],
- "version": "==0.14"
- },
- "filelock": {
- "hashes": [
- "sha256:b8d5ca5ca1c815e1574aee746650ea7301de63d87935b3463d26368b76e31633",
- "sha256:d610c1bb404daf85976d7a82eb2ada120f04671007266b708606565dd03b5be6"
- ],
- "version": "==3.0.10"
- },
- "fuzzywuzzy": {
- "hashes": [
- "sha256:5ac7c0b3f4658d2743aa17da53a55598144edbc5bee3c6863840636e6926f254",
- "sha256:6f49de47db00e1c71d40ad16da42284ac357936fa9b66bea1df63fed07122d62"
- ],
- "version": "==0.17.0"
- },
- "idna": {
- "hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
- ],
- "version": "==2.8"
- },
- "idna-ssl": {
- "hashes": [
- "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"
- ],
- "version": "==1.1.0"
- },
- "imagesize": {
- "hashes": [
- "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8",
- "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5"
- ],
- "version": "==1.1.0"
- },
- "jinja2": {
- "hashes": [
- "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013",
- "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"
- ],
- "version": "==2.10.1"
- },
- "markupsafe": {
- "hashes": [
- "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432",
- "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b",
- "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9",
- "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af",
- "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834",
- "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd",
- "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d",
- "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7",
- "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b",
- "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3",
- "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c",
- "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2",
- "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7",
- "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36",
- "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1",
- "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e",
- "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1",
- "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c",
- "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856",
- "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550",
- "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492",
- "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672",
- "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401",
- "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6",
- "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6",
- "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c",
- "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd",
- "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1"
- ],
- "version": "==1.1.0"
- },
- "more-itertools": {
- "hashes": [
- "sha256:0125e8f60e9e031347105eb1682cef932f5e97d7b9a1a28d9bf00c22a5daef40",
- "sha256:590044e3942351a1bdb1de960b739ff4ce277960f2425ad4509446dbace8d9d1"
- ],
- "version": "==6.0.0"
- },
- "motor": {
- "hashes": [
- "sha256:462fbb824f4289481c158227a2579d6adaf1ec7c70cf7ebe60ed6ceb321e5869",
- "sha256:d035c09ab422bc50bf3efb134f7405694cae76268545bd21e14fb22e2638f84e"
- ],
- "version": "==2.0.0"
- },
- "multidict": {
- "hashes": [
- "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f",
- "sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3",
- "sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef",
- "sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b",
- "sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73",
- "sha256:148ff60e0fffa2f5fad2eb25aae7bef23d8f3b8bdaf947a65cdbe84a978092bc",
- "sha256:1d1c77013a259971a72ddaa83b9f42c80a93ff12df6a4723be99d858fa30bee3",
- "sha256:1d48bc124a6b7a55006d97917f695effa9725d05abe8ee78fd60d6588b8344cd",
- "sha256:31dfa2fc323097f8ad7acd41aa38d7c614dd1960ac6681745b6da124093dc351",
- "sha256:34f82db7f80c49f38b032c5abb605c458bac997a6c3142e0d6c130be6fb2b941",
- "sha256:3d5dd8e5998fb4ace04789d1d008e2bb532de501218519d70bb672c4c5a2fc5d",
- "sha256:4a6ae52bd3ee41ee0f3acf4c60ceb3f44e0e3bc52ab7da1c2b2aa6703363a3d1",
- "sha256:4b02a3b2a2f01d0490dd39321c74273fed0568568ea0e7ea23e02bd1fb10a10b",
- "sha256:4b843f8e1dd6a3195679d9838eb4670222e8b8d01bc36c9894d6c3538316fa0a",
- "sha256:5de53a28f40ef3c4fd57aeab6b590c2c663de87a5af76136ced519923d3efbb3",
- "sha256:61b2b33ede821b94fa99ce0b09c9ece049c7067a33b279f343adfe35108a4ea7",
- "sha256:6a3a9b0f45fd75dc05d8e93dc21b18fc1670135ec9544d1ad4acbcf6b86781d0",
- "sha256:76ad8e4c69dadbb31bad17c16baee61c0d1a4a73bed2590b741b2e1a46d3edd0",
- "sha256:7ba19b777dc00194d1b473180d4ca89a054dd18de27d0ee2e42a103ec9b7d014",
- "sha256:7c1b7eab7a49aa96f3db1f716f0113a8a2e93c7375dd3d5d21c4941f1405c9c5",
- "sha256:7fc0eee3046041387cbace9314926aa48b681202f8897f8bff3809967a049036",
- "sha256:8ccd1c5fff1aa1427100ce188557fc31f1e0a383ad8ec42c559aabd4ff08802d",
- "sha256:8e08dd76de80539d613654915a2f5196dbccc67448df291e69a88712ea21e24a",
- "sha256:c18498c50c59263841862ea0501da9f2b3659c00db54abfbf823a80787fde8ce",
- "sha256:c49db89d602c24928e68c0d510f4fcf8989d77defd01c973d6cbe27e684833b1",
- "sha256:ce20044d0317649ddbb4e54dab3c1bcc7483c78c27d3f58ab3d0c7e6bc60d26a",
- "sha256:d1071414dd06ca2eafa90c85a079169bfeb0e5f57fd0b45d44c092546fcd6fd9",
- "sha256:d3be11ac43ab1a3e979dac80843b42226d5d3cccd3986f2e03152720a4297cd7",
- "sha256:db603a1c235d110c860d5f39988ebc8218ee028f07a7cbc056ba6424372ca31b"
- ],
- "version": "==4.5.2"
- },
- "packaging": {
- "hashes": [
- "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af",
- "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3"
- ],
- "version": "==19.0"
- },
- "pluggy": {
- "hashes": [
- "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616",
- "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a"
- ],
- "version": "==0.8.1"
- },
- "py": {
- "hashes": [
- "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694",
- "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6"
- ],
- "version": "==1.7.0"
- },
- "pygments": {
- "hashes": [
- "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a",
- "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d"
- ],
- "version": "==2.3.1"
- },
- "pymongo": {
- "hashes": [
- "sha256:025f94fc1e1364f00e50badc88c47f98af20012f23317234e51a11333ef986e6",
- "sha256:02aa7fb282606331aefbc0586e2cf540e9dbe5e343493295e7f390936ad2738e",
- "sha256:057210e831573e932702cf332012ed39da78edf0f02d24a3f0b213264a87a397",
- "sha256:0d946b79c56187fe139276d4c8ed612a27a616966c8b9779d6b79e2053587c8b",
- "sha256:104790893b928d310aae8a955e0bdbaa442fb0ac0a33d1bbb0741c791a407778",
- "sha256:15527ef218d95a8717486106553b0d54ff2641e795b65668754e17ab9ca6e381",
- "sha256:1826527a0b032f6e20e7ac7f72d7c26dd476a5e5aa82c04aa1c7088a59fded7d",
- "sha256:22e3aa4ce1c3eebc7f70f9ca7fd4ce1ea33e8bdb7b61996806cd312f08f84a3a",
- "sha256:244e1101e9a48615b9a16cbd194f73c115fdfefc96894803158608115f703b26",
- "sha256:24b8c04fdb633a84829d03909752c385faef249c06114cc8d8e1700b95aae5c8",
- "sha256:2c276696350785d3104412cbe3ac70ab1e3a10c408e7b20599ee41403a3ed630",
- "sha256:2d8474dc833b1182b651b184ace997a7bd83de0f51244de988d3c30e49f07de3",
- "sha256:3119b57fe1d964781e91a53e81532c85ed1701baaddec592e22f6b77a9fdf3df",
- "sha256:3bee8e7e0709b0fcdaa498a3e513bde9ffc7cd09dbceb11e425bd91c89dbd5b6",
- "sha256:436c071e01a464753d30dbfc8768dd93aecf2a8e378e5314d130b95e77b4d612",
- "sha256:46635e3f19ad04d5a7d7cf23d232388ddbfccf46d9a3b7436b6abadda4e84813",
- "sha256:4772e0b679717e7ac4608d996f57b6f380748a919b457cb05bb941467b888b22",
- "sha256:4e2cd80e16f481a62c3175b607373200e714ed29025f21559ebf7524f295689f",
- "sha256:52732960efa0e003ca1c092dc0a3c65276e897681287a788a01ca78dda3b41f0",
- "sha256:55a7de51ec7d1731b2431886d0349146645f2816e5b8eb982d7c49f89472c9f3",
- "sha256:5f8ed5934197a2d4b2087646e98de3e099a237099dcf498b9e38dd3465f74ef4",
- "sha256:64b064124fcbc8eb04a155117dc4d9a336e3cda3f069958fbc44fe70c3c3d1e9",
- "sha256:65958b8e4319f992e85dad59d8081888b97fcdbde5f0d14bc28f2848b92d3ef1",
- "sha256:7683428862e20c6a790c19e64f8ccf487f613fbc83d47e3d532df9c81668d451",
- "sha256:78566d5570c75a127c2491e343dc006798a384f06be588fe9b0cbe5595711559",
- "sha256:7d1cb00c093dbf1d0b16ccf123e79dee3b82608e4a2a88947695f0460eef13ff",
- "sha256:8c74e2a9b594f7962c62cef7680a4cb92a96b4e6e3c2f970790da67cc0213a7e",
- "sha256:8e60aa7699170f55f4b0f56ee6f8415229777ac7e4b4b1aa41fc61eec08c1f1d",
- "sha256:9447b561529576d89d3bf973e5241a88cf76e45bd101963f5236888713dea774",
- "sha256:970055bfeb0be373f2f5299a3db8432444bad3bc2f198753ee6c2a3a781e0959",
- "sha256:a6344b8542e584e140dc3c651d68bde51270e79490aa9320f9e708f9b2c39bd5",
- "sha256:ce309ca470d747b02ba6069d286a17b7df8e9c94d10d727d9cf3a64e51d85184",
- "sha256:cfbd86ed4c2b2ac71bbdbcea6669bf295def7152e3722ddd9dda94ac7981f33d",
- "sha256:d7929c513732dff093481f4a0954ed5ff16816365842136b17caa0b4992e49d3"
- ],
- "version": "==3.7.2"
- },
- "pyparsing": {
- "hashes": [
- "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a",
- "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3"
- ],
- "version": "==2.3.1"
- },
- "pytest": {
- "hashes": [
- "sha256:65aeaa77ae87c7fc95de56285282546cfa9c886dc8e5dc78313db1c25e21bc07",
- "sha256:6ac6d467d9f053e95aaacd79f831dbecfe730f419c6c7022cb316b365cd9199d"
- ],
- "version": "==4.2.0"
- },
- "pytest-asyncio": {
- "hashes": [
- "sha256:9fac5100fd716cbecf6ef89233e8590a4ad61d729d1732e0a96b84182df1daaf",
- "sha256:d734718e25cfc32d2bf78d346e99d33724deeba774cc4afdf491530c6184b63b"
- ],
- "version": "==0.10.0"
- },
- "python-levenshtein-wheels": {
- "hashes": [
- "sha256:0065529c8aec4c044468286177761857d36981ba6f7fdb62d7d5f7ffd143de5d",
- "sha256:016924a59d689f9f47d5f7b26b70f31e309255e8dd72602c91e93ceb752b9f92",
- "sha256:089d046ea7727e583233c71fef1046663ed67b96967063ae8ddc9f551e86a4fc",
- "sha256:0aea217eab612acd45dcc3424a2e8dbd977cc309f80359d0c01971f1e65b9a9b",
- "sha256:0beb91ad80b1573829066e5af36b80190c367be6e0a65292f073353b0388c7fc",
- "sha256:0fa2ca69ef803bc6037a8c919e2e8a17b55e94c9c9ffcb4c21befbb15a1d0f40",
- "sha256:11c77d0d74ab7f46f89a58ae9c2d67349ebc1ae3e18636627f9939d810167c31",
- "sha256:19a68716a322486ddffc8bf7e5cf44a82f7700b05a10658e6e7fc5c7ae92b13d",
- "sha256:19a95a01d28d63b042438ba860c4ace90362906a038fa77962ba33325d377d10",
- "sha256:1a61f3a51e00a3608659bbaabb3f27af37c9dbe84d843369061a3e45cf0d5103",
- "sha256:1c50aebebab403fb2dd415d70355446ac364dece502b0e2737a1a085bb9a4aa4",
- "sha256:1e51cdc123625a28709662d24ea0cb4cf6f991845e6054d9f803c78da1d6b08f",
- "sha256:1f0056d3216b0fe38f25c6f8ebc84bd9f6d34c55a7a9414341b674fb98961399",
- "sha256:228b59460e9a786e498bdfc8011838b89c6054650b115c86c9c819a055a793b0",
- "sha256:23020f9ff2cb3457a926dcc470b84f9bd5b7646bd8b8e06b915bdbbc905cb23f",
- "sha256:3e6bcca97a7ff4e720352b57ddc26380c0583dcdd4b791acef7b574ad58468a7",
- "sha256:3ed88f9e638da57647149115c34e0e120cae6f3d35eee7d77e22cc9c1d8eced3",
- "sha256:445bf7941cb1fa05d6c2a4a502ad4868a5cacd92e8eb77b2bd008cdda9d37c55",
- "sha256:4ba5e147d76d7ee884fd6eae461438b080bcc9f2c6eb9b576811e1bcfe8f808e",
- "sha256:4bb128b719c30f3b9feacfe71a338ae07d39dbffc077139416f3535c89f12362",
- "sha256:53c0c9964390368fd64460b690f168221c669766b193b7e80ae3950c2b9551f8",
- "sha256:57c4edef81611098d37176278f2b6a3712bf864eed313496d7d80504805896d1",
- "sha256:7f7283dfe50eac8a8cd9b777de9eb50b1edf7dbb46fc7cc9d9b0050d0c135021",
- "sha256:7f9759095b3fc825464a72b1cae95125e610eba3c70f91557754c32a0bf32ea2",
- "sha256:98727050ba70eb8d318ec8a8203531c20119347fc8f281102b097326812742ab",
- "sha256:ac9cdf044dcb9481c7da782db01b50c1f0e7cdd78c8507b963b6d072829c0263",
- "sha256:b679f951f842c38665aa54bea4d7403099131f71fac6d8584f893a731fe1266d",
- "sha256:b8c183dc4aa4e95dc5c373eedc3d205c176805835611fcfec5d9050736c695c4",
- "sha256:c2c76f483d05eddec60a5cd89e92385adef565a4f243b1d9a6abe2f6bd2a7c0a",
- "sha256:c388baa3c04272a7c585d3da24030c142353eb26eb531dd2681502e6be7d7a26",
- "sha256:cb0f2a711db665b5bf8697b5af3b9884bb1139385c5c12c2e472e4bbee62da99",
- "sha256:cbac984d7b36e75b440d1c8ff9d3425d778364a0cbc23f8943383d4decd35d5e",
- "sha256:f9084ed3b8997ad4353d124b903f2860a9695b9e080663276d9e58c32e293244"
- ],
- "version": "==0.13.1"
- },
- "pytz": {
- "hashes": [
- "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9",
- "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c"
- ],
- "version": "==2018.9"
- },
- "pyyaml": {
- "hashes": [
- "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b",
- "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf",
- "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a",
- "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3",
- "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1",
- "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1",
- "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613",
- "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04",
- "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f",
- "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537",
- "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531"
- ],
- "version": "==3.13"
- },
- "red-discordbot": {
- "editable": true,
- "extras": [
- "mongo"
- ],
- "path": "."
- },
- "red-lavalink": {
- "hashes": [
- "sha256:2a2f469c1feb72c2604795053a8823757ace85ed752eaf573c1d0daba29d1180",
- "sha256:4bc685a5d89660875d07f50060bacc820e69a763a581ce69375c792e16df4081"
- ],
- "version": "==0.3.0"
- },
- "requests": {
- "hashes": [
- "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e",
- "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"
- ],
- "version": "==2.21.0"
- },
- "schema": {
- "hashes": [
- "sha256:d994b0dc4966000037b26898df638e3e2a694cc73636cb2050e652614a350687",
- "sha256:fa1a53fe5f3b6929725a4e81688c250f46838e25d8c1885a10a590c8c01a7b74"
- ],
- "version": "==0.6.8"
- },
- "six": {
- "hashes": [
- "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
- "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
- ],
- "version": "==1.12.0"
- },
- "snowballstemmer": {
- "hashes": [
- "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128",
- "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89"
- ],
- "version": "==1.2.1"
- },
- "sphinx": {
- "hashes": [
- "sha256:b53904fa7cb4b06a39409a492b949193a1b68cc7241a1a8ce9974f86f0d24287",
- "sha256:c1c00fc4f6e8b101a0d037065043460dffc2d507257f2f11acaed71fd2b0c83c"
- ],
- "version": "==1.8.4"
- },
- "sphinx-rtd-theme": {
- "hashes": [
- "sha256:00cf895504a7895ee433807c62094cf1e95f065843bf3acd17037c3e9a2becd4",
- "sha256:728607e34d60456d736cc7991fd236afb828b21b82f956c5ea75f94c8414040a"
- ],
- "version": "==0.4.3"
- },
- "sphinxcontrib-asyncio": {
- "hashes": [
- "sha256:96627b1ec4eba08d09ad577ff9416c131910333ef37a2c82a2716e59646739f0"
- ],
- "version": "==0.2.0"
- },
- "sphinxcontrib-websupport": {
- "hashes": [
- "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd",
- "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9"
- ],
- "version": "==1.1.0"
- },
- "toml": {
- "hashes": [
- "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c",
- "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"
- ],
- "version": "==0.10.0"
- },
- "tox": {
- "hashes": [
- "sha256:5d6b9e7ad99a93b00ecd509e13552600d38eedd2b035ba24709f850b23f51254",
- "sha256:fee5b4fa2fb1638b57879a1fcaefbfd16201d8d7ecb9956406855a85d518ac4c"
- ],
- "index": "pypi",
- "version": "==3.10.0"
- },
- "urllib3": {
- "hashes": [
- "sha256:4c291ca23bbb55c76518905869ef34bdd5f0e46af7afe6861e8375643ffee1a0",
- "sha256:9a247273df709c4fedb38c711e44292304f73f39ab01beda9f6b9fc375669ac3"
- ],
- "version": "==1.24.2"
- },
- "virtualenv": {
- "hashes": [
- "sha256:15ee248d13e4001a691d9583948ad3947bcb8a289775102e4c4aa98a8b7a6d73",
- "sha256:bfc98bb9b42a3029ee41b96dc00a34c2f254cbf7716bec824477b2c82741a5c4"
- ],
- "version": "==16.5.0"
- },
- "websockets": {
- "hashes": [
- "sha256:0e2f7d6567838369af074f0ef4d0b802d19fa1fee135d864acc656ceefa33136",
- "sha256:2a16dac282b2fdae75178d0ed3d5b9bc3258dabfae50196cbb30578d84b6f6a6",
- "sha256:5a1fa6072405648cb5b3688e9ed3b94be683ce4a4e5723e6f5d34859dee495c1",
- "sha256:5c1f55a1274df9d6a37553fef8cff2958515438c58920897675c9bc70f5a0538",
- "sha256:669d1e46f165e0ad152ed8197f7edead22854a6c90419f544e0f234cc9dac6c4",
- "sha256:695e34c4dbea18d09ab2c258994a8bf6a09564e762655408241f6a14592d2908",
- "sha256:6b2e03d69afa8d20253455e67b64de1a82ff8612db105113cccec35d3f8429f0",
- "sha256:79ca7cdda7ad4e3663ea3c43bfa8637fc5d5604c7737f19a8964781abbd1148d",
- "sha256:7fd2dd9a856f72e6ed06f82facfce01d119b88457cd4b47b7ae501e8e11eba9c",
- "sha256:82c0354ac39379d836719a77ee360ef865377aa6fdead87909d50248d0f05f4d",
- "sha256:8f3b956d11c5b301206382726210dc1d3bee1a9ccf7aadf895aaf31f71c3716c",
- "sha256:91ec98640220ae05b34b79ee88abf27f97ef7c61cf525eec57ea8fcea9f7dddb",
- "sha256:952be9540d83dba815569d5cb5f31708801e0bbfc3a8c5aef1890b57ed7e58bf",
- "sha256:99ac266af38ba1b1fe13975aea01ac0e14bb5f3a3200d2c69f05385768b8568e",
- "sha256:9fa122e7adb24232247f8a89f2d9070bf64b7869daf93ac5e19546b409e47e96",
- "sha256:a0873eadc4b8ca93e2e848d490809e0123eea154aa44ecd0109c4d0171869584",
- "sha256:cb998bd4d93af46b8b49ecf5a72c0a98e5cc6d57fdca6527ba78ad89d6606484",
- "sha256:e02e57346f6a68523e3c43bbdf35dde5c440318d1f827208ae455f6a2ace446d",
- "sha256:e79a5a896bcee7fff24a788d72e5c69f13e61369d055f28113e71945a7eb1559",
- "sha256:ee55eb6bcf23ecc975e6b47c127c201b913598f38b6a300075f84eeef2d3baff",
- "sha256:f1414e6cbcea8d22843e7eafdfdfae3dd1aba41d1945f6ca66e4806c07c4f454"
- ],
- "version": "==6.0"
- },
- "yarl": {
- "hashes": [
- "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9",
- "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f",
- "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb",
- "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320",
- "sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842",
- "sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0",
- "sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829",
- "sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310",
- "sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4",
- "sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8",
- "sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1"
- ],
- "version": "==1.3.0"
- }
- }
-}
diff --git a/README.md b/README.md
index bc7b1e5a6..7d7fd9a6b 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@
-
+
@@ -29,8 +29,8 @@
-
-
+
+
@@ -45,7 +45,7 @@
•
Installation
•
- Documentation
+ Documentation
•
Plugins
•
@@ -83,14 +83,9 @@ community of cog repositories.**
**The following platforms are officially supported:**
-- [Windows](https://red-discordbot.readthedocs.io/en/v3-develop/install_windows.html)
-- [MacOS](https://red-discordbot.readthedocs.io/en/v3-develop/install_linux_mac.html)
-- [Ubuntu](https://red-discordbot.readthedocs.io/en/v3-develop/install_linux_mac.html)
-- [Debian Stretch](https://red-discordbot.readthedocs.io/en/v3-develop/install_linux_mac.html)
-- [CentOS 7](https://red-discordbot.readthedocs.io/en/v3-develop/install_linux_mac.html)
-- [Arch Linux](https://red-discordbot.readthedocs.io/en/v3-develop/install_linux_mac.html)
-- [Raspbian Stretch](https://red-discordbot.readthedocs.io/en/v3-develop/install_linux_mac.html)
-
+- [Windows](https://red-discordbot.readthedocs.io/en/stable/install_windows.html)
+- [MacOS](https://red-discordbot.readthedocs.io/en/stable/install_linux_mac.html)
+- [Most major linux distributions](https://red-discordbot.readthedocs.io/en/stable/install_linux_mac.html)
If after reading the guide you are still experiencing issues, feel free to join the
[Official Discord Server](https://discord.gg/red) and ask in the **#support** channel for help.
@@ -106,7 +101,7 @@ plugins directly from Discord! A few examples are:
- Casino
- Reaction roles
- Slow Mode
-- Anilist
+- AniList
- And much, much more!
Feel free to take a [peek](https://cogboard.red/t/approved-repositories/210) at a list of
@@ -117,7 +112,7 @@ available 3rd party cogs!
**Red** is in continuous development, and it’s supported by an active community which produces new
content (cogs/plugins) for everyone to enjoy. New features are constantly added. If you can’t
[find](https://cogboard.red/t/approved-repositories/210) the cog you’re looking for,
-consult our [guide](https://red-discordbot.readthedocs.io/en/v3-develop/guide_cog_creation.html) on
+consult our [guide](https://red-discordbot.readthedocs.io/en/stable/guide_cog_creation.html) on
building your own cogs!
Join us on our [Official Discord Server](https://discord.gg/red)!
diff --git a/changelog.d/.gitignore b/changelog.d/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/1734.docs.1.rst b/changelog.d/1734.docs.1.rst
new file mode 100644
index 000000000..3995729ef
--- /dev/null
+++ b/changelog.d/1734.docs.1.rst
@@ -0,0 +1,2 @@
+Start the user guides covering cogs and the user interface of the bot. This
+includes, for now, a "Getting started" guide.
diff --git a/changelog.d/2429.enhance.rst b/changelog.d/2429.enhance.rst
new file mode 100644
index 000000000..ebf9e3552
--- /dev/null
+++ b/changelog.d/2429.enhance.rst
@@ -0,0 +1 @@
+Add the option to modify the RPC port with the ``--rpc-port`` flag.
\ No newline at end of file
diff --git a/changelog.d/2558.docs.rst b/changelog.d/2558.docs.rst
new file mode 100644
index 000000000..bb6012427
--- /dev/null
+++ b/changelog.d/2558.docs.rst
@@ -0,0 +1 @@
+Updated linux install docs, adding sections for Fedora Linux, Debian/Raspbian Buster, and openSUSE.
diff --git a/changelog.d/2654.feature.rst b/changelog.d/2654.feature.rst
new file mode 100644
index 000000000..eac3ab395
--- /dev/null
+++ b/changelog.d/2654.feature.rst
@@ -0,0 +1 @@
+Added functions to acquire locks on Config groups and values. These locks are acquired by default when calling a value as a context manager. See :meth:`Value.get_lock` for details
diff --git a/changelog.d/2723.feature.rst b/changelog.d/2723.feature.rst
new file mode 100644
index 000000000..1e2f3d49b
--- /dev/null
+++ b/changelog.d/2723.feature.rst
@@ -0,0 +1 @@
+Added a config driver for PostgreSQL
diff --git a/changelog.d/2723.misc.rst b/changelog.d/2723.misc.rst
new file mode 100644
index 000000000..2d4afcf25
--- /dev/null
+++ b/changelog.d/2723.misc.rst
@@ -0,0 +1,32 @@
+Changes to the ``redbot.core.drivers`` package:
+
+- The modules inside the ``redbot.core.drivers`` package no longer have the ``red_`` prefix in front of their names.
+- All driver classes are now directly accessible as attributes to the ``redbot.core.drivers`` package.
+- :func:`get_driver`'s signature has been changed.
+- :func:`get_driver` can now use data manager to infer the backend type if it is not supplied as an argument.
+- :func:`get_driver_class` has been added.
+
+Changes to the :class:`BaseDriver` and :class:`JsonDriver` classes class:
+
+- :meth:`BaseDriver.get_config_details` is an now abstract staticmethod.
+- :meth:`BaseDriver.initialize` and :meth:`BaseDriver.teardown` are two new abstract coroutine classmethods.
+- :meth:`BaseDriver.delete_all_data` is a new concrete (but overrideable) coroutine instance method.
+- :meth:`BaseDriver.aiter_cogs` is a new abstract asynchronous iterator method.
+- :meth:`BaseDriver.migrate_to` is a new concrete coroutine classmethod.
+- :class:`JsonDriver` no longer requires the data path when constructed and will infer the data path from data manager.
+
+Changes to the :class:`IdentifierData` class and :class:`ConfigCategory` enum:
+
+- ``IdentifierData.custom_group_data`` has been replaced by :attr:`IdentifierData.primary_key_len`.
+- :meth:`ConfigCategory.get_pkey_info` is a new classmethod.
+
+Changes to the migration and backup system:
+
+- All code in the ``redbot.setup`` script, excluding that regarding MongoV1, is now virtually backend-agnostic.
+- All code in the ``[p]backup`` is now backend-agnostic.
+- :func:`redbot.core.config.migrate` is a new coroutine function.
+- All a new driver needs to do now to be compatible with migrations and backups is to implement the :class:`BaseDriver` ABC.
+
+Enhancements to unit tests:
+
+- New tox recipes have been added for testing against Mongo and Postgres backends. See the ``tox.ini`` file for clues on how to run them.
diff --git a/changelog.d/2804.feature.1.rst b/changelog.d/2804.feature.1.rst
new file mode 100644
index 000000000..47f7c47fc
--- /dev/null
+++ b/changelog.d/2804.feature.1.rst
@@ -0,0 +1,9 @@
+Adds methods to Config for accessing things by id without mocked objects
+
+ - Config.guild_from_id
+ - Config.user_from_id
+ - Config.role_from_id
+ - Config.channel_from_id
+ - Config.member_from_ids
+ - This one requires multiple ids, one for the guild, one for the user
+ - Consequence of discord's object model
\ No newline at end of file
diff --git a/changelog.d/2836.feature.rst b/changelog.d/2836.feature.rst
new file mode 100644
index 000000000..2ab5446d1
--- /dev/null
+++ b/changelog.d/2836.feature.rst
@@ -0,0 +1 @@
+New :func:`humanize_number` in :module:`redbot.core.utils.chat_formatting` function to convert numbers into text which respect locale.
\ No newline at end of file
diff --git a/changelog.d/2836.misc.rst b/changelog.d/2836.misc.rst
new file mode 100644
index 000000000..d203c9ec7
--- /dev/null
+++ b/changelog.d/2836.misc.rst
@@ -0,0 +1 @@
+New :func:`humanize_number` is used throughout the bot.
diff --git a/changelog.d/2845.feature.1.rst b/changelog.d/2845.feature.1.rst
new file mode 100644
index 000000000..5a1cdcf30
--- /dev/null
+++ b/changelog.d/2845.feature.1.rst
@@ -0,0 +1,5 @@
+Added New commands to Economy
+
+- ``[p]bank prune user`` - This will delete a user's bank account.
+- ``[p]bank prune local`` - This will prune the bank of accounts from users no longer in the server.
+- ``[p]bank prune global`` - This will prune the global bank of accounts from users who do not share any servers with the bot.
\ No newline at end of file
diff --git a/changelog.d/2845.feature.2.rst b/changelog.d/2845.feature.2.rst
new file mode 100644
index 000000000..63ac4a83a
--- /dev/null
+++ b/changelog.d/2845.feature.2.rst
@@ -0,0 +1,3 @@
+Added :func:`bank_prune` to :module:`redbot.core.bank`
+
+- :func:`bank_prune` can be used to delete a specific user's bank account or remove all invalid bank accounts (For users who are not in the guild if bank is local or share servers with the bot if bank is global).
\ No newline at end of file
diff --git a/changelog.d/2849.misc.rst b/changelog.d/2849.misc.rst
new file mode 100644
index 000000000..6d6074e8a
--- /dev/null
+++ b/changelog.d/2849.misc.rst
@@ -0,0 +1,2 @@
+Added the function ``redbot.core.utils.chat_formatting.text_to_file`` to
+prepare a long text to be send as a file.
diff --git a/changelog.d/2863.bugfix.rst b/changelog.d/2863.bugfix.rst
new file mode 100644
index 000000000..9d32c3d6d
--- /dev/null
+++ b/changelog.d/2863.bugfix.rst
@@ -0,0 +1 @@
+Help properly hides disabled commands.
diff --git a/changelog.d/2872.feature.rst b/changelog.d/2872.feature.rst
new file mode 100644
index 000000000..d4e20a46a
--- /dev/null
+++ b/changelog.d/2872.feature.rst
@@ -0,0 +1 @@
+Red now uses towncrier for changelog generation
\ No newline at end of file
diff --git a/changelog.d/2875.enhance.rst b/changelog.d/2875.enhance.rst
new file mode 100644
index 000000000..79ae6a859
--- /dev/null
+++ b/changelog.d/2875.enhance.rst
@@ -0,0 +1 @@
+Slots now has a 62.5% expected payout and won't inflate economy when spammed.
\ No newline at end of file
diff --git a/changelog.d/2881.enhance.rst b/changelog.d/2881.enhance.rst
new file mode 100644
index 000000000..6a7c15881
--- /dev/null
+++ b/changelog.d/2881.enhance.rst
@@ -0,0 +1 @@
+Allow passing cls in the :func:`redbot.core.commands.group()` decorator
diff --git a/changelog.d/2882.docs.rst b/changelog.d/2882.docs.rst
new file mode 100644
index 000000000..76bdc33a2
--- /dev/null
+++ b/changelog.d/2882.docs.rst
@@ -0,0 +1 @@
+Create documentation covering what we consider a developer facing breaking change and guarantees regarding them.
\ No newline at end of file
diff --git a/changelog.d/2885.misc.rst b/changelog.d/2885.misc.rst
new file mode 100644
index 000000000..d7e2ac3db
--- /dev/null
+++ b/changelog.d/2885.misc.rst
@@ -0,0 +1 @@
+[Tunnel] Added ``use_cached`` and ``images_only`` kwargs to `redbot.core.utils.Tunnel.files_from_attach`
\ No newline at end of file
diff --git a/changelog.d/2888.bugfix.rst b/changelog.d/2888.bugfix.rst
new file mode 100644
index 000000000..19f76701d
--- /dev/null
+++ b/changelog.d/2888.bugfix.rst
@@ -0,0 +1 @@
+Fixed remove_command error when trying to remove a non-existent command
\ No newline at end of file
diff --git a/changelog.d/2892.bugfix.1.rst b/changelog.d/2892.bugfix.1.rst
new file mode 100644
index 000000000..f976e6c8c
--- /dev/null
+++ b/changelog.d/2892.bugfix.1.rst
@@ -0,0 +1 @@
+``Command.can_see`` now works as intended for disabled commands
diff --git a/changelog.d/2892.enhance.rst b/changelog.d/2892.enhance.rst
new file mode 100644
index 000000000..67aa8ea2f
--- /dev/null
+++ b/changelog.d/2892.enhance.rst
@@ -0,0 +1 @@
+Red's Help Formatter is now considered to have a stable API.
\ No newline at end of file
diff --git a/changelog.d/2897.breaking.1.rst b/changelog.d/2897.breaking.1.rst
new file mode 100644
index 000000000..249871d7b
--- /dev/null
+++ b/changelog.d/2897.breaking.1.rst
@@ -0,0 +1 @@
+Modlog casetypes no longer have an attribute for auditlog action type.
\ No newline at end of file
diff --git a/changelog.d/2897.bugfix.1.rst b/changelog.d/2897.bugfix.1.rst
new file mode 100644
index 000000000..8bc2bbeb7
--- /dev/null
+++ b/changelog.d/2897.bugfix.1.rst
@@ -0,0 +1 @@
+Modlog entries now show up properly without the mod cog loaded
\ No newline at end of file
diff --git a/changelog.d/2897.enhance.2.rst b/changelog.d/2897.enhance.2.rst
new file mode 100644
index 000000000..3a48af0f0
--- /dev/null
+++ b/changelog.d/2897.enhance.2.rst
@@ -0,0 +1 @@
+Modlog no longer generates cases without being told to for actions the bot did.
\ No newline at end of file
diff --git a/changelog.d/2897.enhance.3.rst b/changelog.d/2897.enhance.3.rst
new file mode 100644
index 000000000..8e69e1cfb
--- /dev/null
+++ b/changelog.d/2897.enhance.3.rst
@@ -0,0 +1 @@
+Some generic modlog casetypes are now pre-registered for cog creator use
\ No newline at end of file
diff --git a/changelog.d/2908.breaking.rst b/changelog.d/2908.breaking.rst
new file mode 100644
index 000000000..a8abb03f8
--- /dev/null
+++ b/changelog.d/2908.breaking.rst
@@ -0,0 +1 @@
+``redbot.core.modlog.get_next_case_number()`` has been removed.
diff --git a/changelog.d/2908.bugfix.rst b/changelog.d/2908.bugfix.rst
new file mode 100644
index 000000000..5ab962290
--- /dev/null
+++ b/changelog.d/2908.bugfix.rst
@@ -0,0 +1 @@
+Fixed error in `[p]reason` when setting the reason for a case without a moderator.
diff --git a/changelog.d/2908.enhance.rst b/changelog.d/2908.enhance.rst
new file mode 100644
index 000000000..660ff914e
--- /dev/null
+++ b/changelog.d/2908.enhance.rst
@@ -0,0 +1 @@
+ModLog is now much faster at creating cases, especially in large servers.
diff --git a/changelog.d/2908.feature.rst b/changelog.d/2908.feature.rst
new file mode 100644
index 000000000..66a212907
--- /dev/null
+++ b/changelog.d/2908.feature.rst
@@ -0,0 +1 @@
+Added :func:`redbot.core.modlog.get_latest_case` to fetch the case object for the most recent ModLog case.
diff --git a/changelog.d/2914.docs.rst b/changelog.d/2914.docs.rst
new file mode 100644
index 000000000..0debb16cf
--- /dev/null
+++ b/changelog.d/2914.docs.rst
@@ -0,0 +1 @@
+Fixed user parameter being labeled as discord.TextChannel instead of discord.abc.User.
diff --git a/changelog.d/2915.docs.rst b/changelog.d/2915.docs.rst
new file mode 100644
index 000000000..712c6c87e
--- /dev/null
+++ b/changelog.d/2915.docs.rst
@@ -0,0 +1 @@
+Updated towncrier info in contribution guidelines to include how to do a standalone PR.
\ No newline at end of file
diff --git a/changelog.d/2920.docs.rst b/changelog.d/2920.docs.rst
new file mode 100644
index 000000000..d50d6f591
--- /dev/null
+++ b/changelog.d/2920.docs.rst
@@ -0,0 +1 @@
+Reworded virtual environment guide to make it sound less scary.
diff --git a/changelog.d/2921.enhance.rst b/changelog.d/2921.enhance.rst
new file mode 100644
index 000000000..7d372cf29
--- /dev/null
+++ b/changelog.d/2921.enhance.rst
@@ -0,0 +1 @@
+JSON config files are now stored without indentation, this is to reduce file size and increase performance of write operations.
diff --git a/changelog.d/2923.bugfix.rst b/changelog.d/2923.bugfix.rst
new file mode 100644
index 000000000..7be210ff8
--- /dev/null
+++ b/changelog.d/2923.bugfix.rst
@@ -0,0 +1 @@
+Check the recipient balance before transferring and stop transfer if will go above the maximum allowed balance.
\ No newline at end of file
diff --git a/changelog.d/2924.misc.rst b/changelog.d/2924.misc.rst
new file mode 100644
index 000000000..bbfa22c17
--- /dev/null
+++ b/changelog.d/2924.misc.rst
@@ -0,0 +1 @@
+Fixed Requires docs inconsistencies
diff --git a/changelog.d/2926.breaking.rst b/changelog.d/2926.breaking.rst
new file mode 100644
index 000000000..ea6ed30a8
--- /dev/null
+++ b/changelog.d/2926.breaking.rst
@@ -0,0 +1 @@
+Removed :cons:`bank.MAX_BALANCE`, use :meth:`bank.get_max_balance()` from now.
\ No newline at end of file
diff --git a/changelog.d/2926.feature.rst b/changelog.d/2926.feature.rst
new file mode 100644
index 000000000..c68f48d5e
--- /dev/null
+++ b/changelog.d/2926.feature.rst
@@ -0,0 +1 @@
+`[p]bankset maxbal` can be used to set the maximum bank balance.
diff --git a/changelog.d/2928.removal.rst b/changelog.d/2928.removal.rst
new file mode 100644
index 000000000..1a4bbee23
--- /dev/null
+++ b/changelog.d/2928.removal.rst
@@ -0,0 +1 @@
+The ``set owner`` and ``set token`` commands have been removed in favor of managing server side.
\ No newline at end of file
diff --git a/changelog.d/2939.misc.1.rst b/changelog.d/2939.misc.1.rst
new file mode 100644
index 000000000..1fd5f21b4
--- /dev/null
+++ b/changelog.d/2939.misc.1.rst
@@ -0,0 +1 @@
+Updated dependencies, most notably PyYAML, tqdm, uvloop and pymongo.
diff --git a/changelog.d/2939.misc.2.rst b/changelog.d/2939.misc.2.rst
new file mode 100644
index 000000000..b67b15a5e
--- /dev/null
+++ b/changelog.d/2939.misc.2.rst
@@ -0,0 +1 @@
+Setting the ``PYTHON`` env var whilst running ``make`` now allows you to specify which python executable to use.
diff --git a/changelog.d/2941.misc.rst b/changelog.d/2941.misc.rst
new file mode 100644
index 000000000..0b2b4bf95
--- /dev/null
+++ b/changelog.d/2941.misc.rst
@@ -0,0 +1 @@
+Add `pip-wheel-metadata` folder to `.gitignore` file - pip creates it when installing Red in venv
\ No newline at end of file
diff --git a/changelog.d/2948.bugfix.rst b/changelog.d/2948.bugfix.rst
new file mode 100644
index 000000000..aeee92878
--- /dev/null
+++ b/changelog.d/2948.bugfix.rst
@@ -0,0 +1 @@
+The [p]invite command no longer errors when a user has the bot blocked or DMs disabled in the server.
diff --git a/changelog.d/2949.misc.rst b/changelog.d/2949.misc.rst
new file mode 100644
index 000000000..b65940dd1
--- /dev/null
+++ b/changelog.d/2949.misc.rst
@@ -0,0 +1 @@
+Renamed two changelog files from fix to bugfix.
diff --git a/changelog.d/2953.misc.rst b/changelog.d/2953.misc.rst
new file mode 100644
index 000000000..b30f69e77
--- /dev/null
+++ b/changelog.d/2953.misc.rst
@@ -0,0 +1 @@
+Fixed a typo in CONTRIBUTING.md.
diff --git a/changelog.d/2954.bugfix.rst b/changelog.d/2954.bugfix.rst
new file mode 100644
index 000000000..e5e1c53cc
--- /dev/null
+++ b/changelog.d/2954.bugfix.rst
@@ -0,0 +1 @@
+Stop using `:` character in backup's filename - Windows doesn't accept it
\ No newline at end of file
diff --git a/changelog.d/2955.bugfix.rst b/changelog.d/2955.bugfix.rst
new file mode 100644
index 000000000..3ca92fad8
--- /dev/null
+++ b/changelog.d/2955.bugfix.rst
@@ -0,0 +1 @@
+``redbot-setup delete`` no longer errors about "unexpected keyword argument"
\ No newline at end of file
diff --git a/changelog.d/2956.bugfix.rst b/changelog.d/2956.bugfix.rst
new file mode 100644
index 000000000..8f5bbca45
--- /dev/null
+++ b/changelog.d/2956.bugfix.rst
@@ -0,0 +1 @@
+``redbot-setup delete`` no longer prompts about backup when user passes ``--no-prompt`` option
\ No newline at end of file
diff --git a/changelog.d/2958.enhance.1.rst b/changelog.d/2958.enhance.1.rst
new file mode 100644
index 000000000..876a29529
--- /dev/null
+++ b/changelog.d/2958.enhance.1.rst
@@ -0,0 +1 @@
+``--[no-]backup``, ``--[no-]drop-db`` and ``--[no-]remove-datapath`` in ``redbot-setup delete`` command are now on/off flags.
\ No newline at end of file
diff --git a/changelog.d/2958.enhance.2.rst b/changelog.d/2958.enhance.2.rst
new file mode 100644
index 000000000..f4bba69a8
--- /dev/null
+++ b/changelog.d/2958.enhance.2.rst
@@ -0,0 +1 @@
+Confirmation prompts in ``redbot-setup`` now have default values for user convenience.
\ No newline at end of file
diff --git a/changelog.d/2963.bugfix.rst b/changelog.d/2963.bugfix.rst
new file mode 100644
index 000000000..a6fe397e2
--- /dev/null
+++ b/changelog.d/2963.bugfix.rst
@@ -0,0 +1 @@
+[Core] Inviteset public and perms help string cleanup
\ No newline at end of file
diff --git a/changelog.d/2966.bugfix.rst b/changelog.d/2966.bugfix.rst
new file mode 100644
index 000000000..b615eace2
--- /dev/null
+++ b/changelog.d/2966.bugfix.rst
@@ -0,0 +1 @@
+Make embedset user only affect DM's
diff --git a/changelog.d/2967.breaking.rst b/changelog.d/2967.breaking.rst
new file mode 100644
index 000000000..cc66095a7
--- /dev/null
+++ b/changelog.d/2967.breaking.rst
@@ -0,0 +1,11 @@
+The main bot config is no longer directly accessible to cogs. New methods have been added for use where this is concerned.
+New methods for this include
+
+ - ``bot.get_shared_api_tokens``
+ - ``bot.set_shared_api_tokens``
+ - ``bot.get_embed_color``
+ - ``bot.get_embed_colour``
+ - ``bot.get_admin_roles``
+ - ``bot.get_admin_role_ids``
+ - ``bot.get_mod_roles``
+ - ``bot.get_mod_role_ids``
diff --git a/changelog.d/2968.bugfix.rst b/changelog.d/2968.bugfix.rst
new file mode 100644
index 000000000..5f6065eb2
--- /dev/null
+++ b/changelog.d/2968.bugfix.rst
@@ -0,0 +1 @@
+Give friendly error when provided instance name doesn't exist.
diff --git a/changelog.d/2973.breaking.rst b/changelog.d/2973.breaking.rst
new file mode 100644
index 000000000..8a36fcc1f
--- /dev/null
+++ b/changelog.d/2973.breaking.rst
@@ -0,0 +1 @@
+Reserves some command names for internal Red use. These are available programatically as ``redbot.core.commands.RESERVED_COMMAND_NAMES``
\ No newline at end of file
diff --git a/changelog.d/2974.bugfix.rst b/changelog.d/2974.bugfix.rst
new file mode 100644
index 000000000..65a856a64
--- /dev/null
+++ b/changelog.d/2974.bugfix.rst
@@ -0,0 +1 @@
+Fixed the help text and response of `[p]set usebotcolor` to accurately reflect what the command is doing.
diff --git a/changelog.d/2976.breaking.rst b/changelog.d/2976.breaking.rst
new file mode 100644
index 000000000..4f87f3b38
--- /dev/null
+++ b/changelog.d/2976.breaking.rst
@@ -0,0 +1 @@
+Removes bot._counter, Makes a few more attrs private (cog_mgr, main_dir)
\ No newline at end of file
diff --git a/changelog.d/2976.feature.rst b/changelog.d/2976.feature.rst
new file mode 100644
index 000000000..c5f76df18
--- /dev/null
+++ b/changelog.d/2976.feature.rst
@@ -0,0 +1,6 @@
+adds a few methods and classes replacing direct config access (which is no longer supported)
+
+ - ``redbot.core.Red.allowed_by_whitelist_blacklist``
+ - ``redbot.core.Red.get_valid_prefixes``
+ - ``redbot.core.Red.clear_shared_api_tokens``
+ - ``redbot.core.commands.help.HelpSettings``
\ No newline at end of file
diff --git a/changelog.d/2985.bugfix.rst b/changelog.d/2985.bugfix.rst
new file mode 100644
index 000000000..cb9ee2653
--- /dev/null
+++ b/changelog.d/2985.bugfix.rst
@@ -0,0 +1 @@
+Bot no longer types infinitely when command with cooldown is called within last second of cooldown.
\ No newline at end of file
diff --git a/changelog.d/2986.docs.rst b/changelog.d/2986.docs.rst
new file mode 100644
index 000000000..2809601e0
--- /dev/null
+++ b/changelog.d/2986.docs.rst
@@ -0,0 +1 @@
+Added more information about ``redbot.core.utils.humanize_timedelta`` into the docs
\ No newline at end of file
diff --git a/changelog.d/2986.misc.rst b/changelog.d/2986.misc.rst
new file mode 100644
index 000000000..7a1d0ad33
--- /dev/null
+++ b/changelog.d/2986.misc.rst
@@ -0,0 +1 @@
+Updated the typing of ``redbot.core.utils.humanize_timedelta`` to be more accurate.
\ No newline at end of file
diff --git a/changelog.d/2995.docs.rst b/changelog.d/2995.docs.rst
new file mode 100644
index 000000000..2a6f9f498
--- /dev/null
+++ b/changelog.d/2995.docs.rst
@@ -0,0 +1 @@
+Add direct link to "Installing Red" section in "Installing using powershell and chocolatey"
diff --git a/changelog.d/2997.misc.rst b/changelog.d/2997.misc.rst
new file mode 100644
index 000000000..f2c131261
--- /dev/null
+++ b/changelog.d/2997.misc.rst
@@ -0,0 +1 @@
+Fixed a crash seen when calling economy commands in DM with a global bank.
\ No newline at end of file
diff --git a/changelog.d/2998.docs.rst b/changelog.d/2998.docs.rst
new file mode 100644
index 000000000..943d1db01
--- /dev/null
+++ b/changelog.d/2998.docs.rst
@@ -0,0 +1 @@
+Update Git PATH install (Windows), capitalise some words, don't mention to launcher
\ No newline at end of file
diff --git a/changelog.d/3002.bugfix.rst b/changelog.d/3002.bugfix.rst
new file mode 100644
index 000000000..bf19c1b76
--- /dev/null
+++ b/changelog.d/3002.bugfix.rst
@@ -0,0 +1 @@
+remove f-string usage in launcher to prevent our error handling from cauing an error.
\ No newline at end of file
diff --git a/changelog.d/3004.bugfix.rst b/changelog.d/3004.bugfix.rst
new file mode 100644
index 000000000..05e31452f
--- /dev/null
+++ b/changelog.d/3004.bugfix.rst
@@ -0,0 +1 @@
+Fixed MessagePredicate.greater and MessagePredicate.less allowing any valid int instead of only valid ints/floats that are greater/less than the given value.
diff --git a/changelog.d/3008.bugfix.rst b/changelog.d/3008.bugfix.rst
new file mode 100644
index 000000000..2df20bfaf
--- /dev/null
+++ b/changelog.d/3008.bugfix.rst
@@ -0,0 +1 @@
+Uptime command works with uptimes of under a second
\ No newline at end of file
diff --git a/changelog.d/3008.misc.rst b/changelog.d/3008.misc.rst
new file mode 100644
index 000000000..3f99a7ca0
--- /dev/null
+++ b/changelog.d/3008.misc.rst
@@ -0,0 +1 @@
+update some UI to include copyright
\ No newline at end of file
diff --git a/changelog.d/3010.bugfix.rst b/changelog.d/3010.bugfix.rst
new file mode 100644
index 000000000..7d36a7521
--- /dev/null
+++ b/changelog.d/3010.bugfix.rst
@@ -0,0 +1 @@
+Add quotation marks to helpset tagline's response so two consecutive full stops don't appear
\ No newline at end of file
diff --git a/changelog.d/3014.bugfix.rst b/changelog.d/3014.bugfix.rst
new file mode 100644
index 000000000..5014a8b49
--- /dev/null
+++ b/changelog.d/3014.bugfix.rst
@@ -0,0 +1 @@
+Fixes an issue with clearing rules in permissions
\ No newline at end of file
diff --git a/changelog.d/3017.misc.rst b/changelog.d/3017.misc.rst
new file mode 100644
index 000000000..545326eaa
--- /dev/null
+++ b/changelog.d/3017.misc.rst
@@ -0,0 +1 @@
+fixes a missing await from #2976
\ No newline at end of file
diff --git a/changelog.d/3021.docs.rst b/changelog.d/3021.docs.rst
new file mode 100644
index 000000000..dfef4c45c
--- /dev/null
+++ b/changelog.d/3021.docs.rst
@@ -0,0 +1 @@
+Update Cog Creation guide with a note regarding the Develop version as well as folder layout for local cogs
diff --git a/changelog.d/3024.bugfix.rst b/changelog.d/3024.bugfix.rst
new file mode 100644
index 000000000..4a768cf57
--- /dev/null
+++ b/changelog.d/3024.bugfix.rst
@@ -0,0 +1 @@
+cog install will no longer error if a cog creator has an empty install message
diff --git a/changelog.d/3025.enhance.rst b/changelog.d/3025.enhance.rst
new file mode 100644
index 000000000..327be122c
--- /dev/null
+++ b/changelog.d/3025.enhance.rst
@@ -0,0 +1 @@
+Link to Getting started guide at the end of installation guides.
\ No newline at end of file
diff --git a/changelog.d/3033.bugfix.rst b/changelog.d/3033.bugfix.rst
new file mode 100644
index 000000000..e272b2e7a
--- /dev/null
+++ b/changelog.d/3033.bugfix.rst
@@ -0,0 +1 @@
+Lavalink will now be restarted after unexpected shutdown.
\ No newline at end of file
diff --git a/changelog.d/3036.bugfix.rst b/changelog.d/3036.bugfix.rst
new file mode 100644
index 000000000..29fc8ae1d
--- /dev/null
+++ b/changelog.d/3036.bugfix.rst
@@ -0,0 +1 @@
+Add 3rd-party lib folder to ``sys.path`` before loading cogs. This prevents issues with 3rd-party cogs failing to load without loaded Downloader due to unavailable requirements.
\ No newline at end of file
diff --git a/changelog.d/3052.enhance.rst b/changelog.d/3052.enhance.rst
new file mode 100644
index 000000000..76366d55f
--- /dev/null
+++ b/changelog.d/3052.enhance.rst
@@ -0,0 +1 @@
+``bot.send_filtered`` now returns the message that is sent.
diff --git a/changelog.d/3053.docs.1.rst b/changelog.d/3053.docs.1.rst
new file mode 100644
index 000000000..c17689fc9
--- /dev/null
+++ b/changelog.d/3053.docs.1.rst
@@ -0,0 +1 @@
+Discord.py docs links will now always use docs for currently used version of discord.py.
\ No newline at end of file
diff --git a/changelog.d/3053.docs.2.rst b/changelog.d/3053.docs.2.rst
new file mode 100644
index 000000000..fa5f06b26
--- /dev/null
+++ b/changelog.d/3053.docs.2.rst
@@ -0,0 +1 @@
+Add ``|DPY_VERSION|`` substitution that will automatically get replaced by current discord.py version.
\ No newline at end of file
diff --git a/changelog.d/3054.docs.rst b/changelog.d/3054.docs.rst
new file mode 100644
index 000000000..78945ca0a
--- /dev/null
+++ b/changelog.d/3054.docs.rst
@@ -0,0 +1 @@
+Add missing descriptions for function returns.
\ No newline at end of file
diff --git a/changelog.d/3057.bugfix.rst b/changelog.d/3057.bugfix.rst
new file mode 100644
index 000000000..da388eeac
--- /dev/null
+++ b/changelog.d/3057.bugfix.rst
@@ -0,0 +1 @@
+Bot will now properly send a message when the invoked command is guild-only.
\ No newline at end of file
diff --git a/changelog.d/3057.enhance.rst b/changelog.d/3057.enhance.rst
new file mode 100644
index 000000000..01748722e
--- /dev/null
+++ b/changelog.d/3057.enhance.rst
@@ -0,0 +1 @@
+Bot will now send a message when the invoked command is DM-only.
\ No newline at end of file
diff --git a/changelog.d/3062.bugfix.rst b/changelog.d/3062.bugfix.rst
new file mode 100644
index 000000000..5b4147525
--- /dev/null
+++ b/changelog.d/3062.bugfix.rst
@@ -0,0 +1 @@
+Always append 3rd-party lib folder to the end of ``sys.path`` to avoid shadowing Red's dependencies.
\ No newline at end of file
diff --git a/changelog.d/3069.fix.rst b/changelog.d/3069.fix.rst
new file mode 100644
index 000000000..bbe3572f3
--- /dev/null
+++ b/changelog.d/3069.fix.rst
@@ -0,0 +1 @@
+Discord.py is updated to 1.2.4 to handle a critical issue with voice connections
diff --git a/changelog.d/3082.docs.rst b/changelog.d/3082.docs.rst
new file mode 100644
index 000000000..366ad4ce5
--- /dev/null
+++ b/changelog.d/3082.docs.rst
@@ -0,0 +1 @@
+Do not overwrite the docs/prolog.txt file in conf.py.
\ No newline at end of file
diff --git a/changelog.d/admin/.gitignore b/changelog.d/admin/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/admin/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/admin/3016.enhance.rst b/changelog.d/admin/3016.enhance.rst
new file mode 100644
index 000000000..66f393299
--- /dev/null
+++ b/changelog.d/admin/3016.enhance.rst
@@ -0,0 +1 @@
+Add custom issue messages for adding and removing roles, this makes it easier to create translations.
\ No newline at end of file
diff --git a/changelog.d/alias/.gitignore b/changelog.d/alias/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/alias/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/audio/.gitignore b/changelog.d/audio/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/audio/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/audio/270.feature.rst b/changelog.d/audio/270.feature.rst
new file mode 100644
index 000000000..8ab87d40f
--- /dev/null
+++ b/changelog.d/audio/270.feature.rst
@@ -0,0 +1 @@
+Added support for nested folders in the localtrack folder.
\ No newline at end of file
diff --git a/changelog.d/audio/2861.bugfix.1.rst b/changelog.d/audio/2861.bugfix.1.rst
new file mode 100644
index 000000000..4fe209e39
--- /dev/null
+++ b/changelog.d/audio/2861.bugfix.1.rst
@@ -0,0 +1 @@
+``[p]playlist remove`` now removes the playlist url if the playlist was created through ``[p]playlist save``.
diff --git a/changelog.d/audio/2861.bugfix.2.rst b/changelog.d/audio/2861.bugfix.2.rst
new file mode 100644
index 000000000..5a686e790
--- /dev/null
+++ b/changelog.d/audio/2861.bugfix.2.rst
@@ -0,0 +1 @@
+Users are no longer able to accidentally overwrite existing playlist if a new one with the same name is created/rename.
diff --git a/changelog.d/audio/2861.enhance.1.rst b/changelog.d/audio/2861.enhance.1.rst
new file mode 100644
index 000000000..22e392132
--- /dev/null
+++ b/changelog.d/audio/2861.enhance.1.rst
@@ -0,0 +1 @@
+``[p]playlist upload`` will now load playlists generated via ``[p]playlist download`` much faster if the playlist use the new scheme.
diff --git a/changelog.d/audio/2861.enhance.2.rst b/changelog.d/audio/2861.enhance.2.rst
new file mode 100644
index 000000000..bd0810d96
--- /dev/null
+++ b/changelog.d/audio/2861.enhance.2.rst
@@ -0,0 +1 @@
+``[p]playlist`` commands now can be used by everyone regardless of DJ settings, however it will respect DJ settings when creating/modifying playlist in the server scope.
diff --git a/changelog.d/audio/2861.feature.1.rst b/changelog.d/audio/2861.feature.1.rst
new file mode 100644
index 000000000..b26f4049e
--- /dev/null
+++ b/changelog.d/audio/2861.feature.1.rst
@@ -0,0 +1 @@
+Playlist are now stored in a dataclass and new APIs were added to interact with them see :module:`redbot.cogs.audio.playlist` for more details.
diff --git a/changelog.d/audio/2861.feature.2.rst b/changelog.d/audio/2861.feature.2.rst
new file mode 100644
index 000000000..768f22b13
--- /dev/null
+++ b/changelog.d/audio/2861.feature.2.rst
@@ -0,0 +1 @@
+All Playlist commands now accept optional arguments, use ``[p]help playlist `` for more details.
diff --git a/changelog.d/audio/2861.feature.3.rst b/changelog.d/audio/2861.feature.3.rst
new file mode 100644
index 000000000..d0089f1f2
--- /dev/null
+++ b/changelog.d/audio/2861.feature.3.rst
@@ -0,0 +1 @@
+``[p]playlist rename`` will now allow users to rename existing playlists.
diff --git a/changelog.d/audio/2861.feature.4.rst b/changelog.d/audio/2861.feature.4.rst
new file mode 100644
index 000000000..1e79bb342
--- /dev/null
+++ b/changelog.d/audio/2861.feature.4.rst
@@ -0,0 +1 @@
+``[p]playlist update`` will allow users to update non custom Playlists to the latest available tracks.
diff --git a/changelog.d/audio/2861.feature.5.rst b/changelog.d/audio/2861.feature.5.rst
new file mode 100644
index 000000000..0ef6b9d1b
--- /dev/null
+++ b/changelog.d/audio/2861.feature.5.rst
@@ -0,0 +1,16 @@
+There are 3 different scopes of playlist now, to define them use the ``--scope`` argument.
+
+ ``Global Playlist``
+
+ - These playlists will be available in all servers the bot is in.
+ - These can be managed by the Bot Owner only.
+
+ ``Server Playlist``
+
+ - These playlists will only be available in the server they were created in.
+ - These can be managed by the Bot Owner, Guild Owner, Mods, Admins, DJs and creator (if DJ role is disabled).
+
+ ``User Playlist``
+
+ - These playlists will be available in all servers both the bot and the creator are in.
+ - These can be managed by the Bot Owner and Creator only.
\ No newline at end of file
diff --git a/changelog.d/audio/2861.misc.1.rst b/changelog.d/audio/2861.misc.1.rst
new file mode 100644
index 000000000..f0956ddb6
--- /dev/null
+++ b/changelog.d/audio/2861.misc.1.rst
@@ -0,0 +1 @@
+:class:`ArgParserFailure` was added to :class:`redbot.core.commands.errors` to allow user friendly errors from ArgParser Converters.
diff --git a/changelog.d/audio/2861.misc.2.rst b/changelog.d/audio/2861.misc.2.rst
new file mode 100644
index 000000000..f06aadea7
--- /dev/null
+++ b/changelog.d/audio/2861.misc.2.rst
@@ -0,0 +1 @@
+Automatic handling of :class:`redbot.core.commands.errors.ArgParserFailure` on :meth:`Cog.on_command_error`.
\ No newline at end of file
diff --git a/changelog.d/audio/2861.misc.3.rst b/changelog.d/audio/2861.misc.3.rst
new file mode 100644
index 000000000..fe1653d55
--- /dev/null
+++ b/changelog.d/audio/2861.misc.3.rst
@@ -0,0 +1 @@
+Playlists are now stored in 3 different scopes ``GLOBALPLAYLIST``, ``GUILDPLAYLIST``, ``USERPLAYLIST``.
diff --git a/changelog.d/audio/2861.misc.4.rst b/changelog.d/audio/2861.misc.4.rst
new file mode 100644
index 000000000..563d7245b
--- /dev/null
+++ b/changelog.d/audio/2861.misc.4.rst
@@ -0,0 +1 @@
+:class:`ScopeParser` is used to parse optional arguments for all playlist commands.
\ No newline at end of file
diff --git a/changelog.d/audio/2861.misc.5.rst b/changelog.d/audio/2861.misc.5.rst
new file mode 100644
index 000000000..73ff90b55
--- /dev/null
+++ b/changelog.d/audio/2861.misc.5.rst
@@ -0,0 +1 @@
+:method:`Audio.can_manage_playlist` is now used to check users permissions when managing playlists.
diff --git a/changelog.d/audio/2861.misc.6.rst b/changelog.d/audio/2861.misc.6.rst
new file mode 100644
index 000000000..5469346e1
--- /dev/null
+++ b/changelog.d/audio/2861.misc.6.rst
@@ -0,0 +1 @@
+:meth:`Audio._migrate_config` will automatically migrate old schema playlist to the new schema.
diff --git a/changelog.d/audio/2890.enhance.1.rst b/changelog.d/audio/2890.enhance.1.rst
new file mode 100644
index 000000000..55fa674a1
--- /dev/null
+++ b/changelog.d/audio/2890.enhance.1.rst
@@ -0,0 +1 @@
+Spotify, Youtube Data and Lavalink API calls can be cached to avoid repeated calls in the future, see ``[p]audioset cache``.
\ No newline at end of file
diff --git a/changelog.d/audio/2890.enhance.2.rst b/changelog.d/audio/2890.enhance.2.rst
new file mode 100644
index 000000000..0af2598a9
--- /dev/null
+++ b/changelog.d/audio/2890.enhance.2.rst
@@ -0,0 +1 @@
+Playlist will now start playing as soon as first track is loaded.
diff --git a/changelog.d/audio/2890.misc.1.rst b/changelog.d/audio/2890.misc.1.rst
new file mode 100644
index 000000000..2a31df96c
--- /dev/null
+++ b/changelog.d/audio/2890.misc.1.rst
@@ -0,0 +1 @@
+Spotify and Youtube API functions have been moved to :module:`redbot.cogs.audio.api` under :class:`SpotifyAPI` and :class:`YouTubeAPI`.
\ No newline at end of file
diff --git a/changelog.d/audio/2890.misc.2.rst b/changelog.d/audio/2890.misc.2.rst
new file mode 100644
index 000000000..326a1328b
--- /dev/null
+++ b/changelog.d/audio/2890.misc.2.rst
@@ -0,0 +1 @@
+:class:`MusicCache` now handles the Spotify, Youtube Data and Lavalink API calls, this queries the cache first before making API calls.
diff --git a/changelog.d/audio/2890.misc.3.rst b/changelog.d/audio/2890.misc.3.rst
new file mode 100644
index 000000000..2d45531fd
--- /dev/null
+++ b/changelog.d/audio/2890.misc.3.rst
@@ -0,0 +1 @@
+Due to playlist loading order changes users are unable to load tracks while a playlist is currently loading.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.bugfix.1.rst b/changelog.d/audio/2904.bugfix.1.rst
new file mode 100644
index 000000000..74ec8775f
--- /dev/null
+++ b/changelog.d/audio/2904.bugfix.1.rst
@@ -0,0 +1 @@
+``[p]audioset settings`` no longer shows lavalink JAR version.
diff --git a/changelog.d/audio/2904.bugfix.2.rst b/changelog.d/audio/2904.bugfix.2.rst
new file mode 100644
index 000000000..20ac7f463
--- /dev/null
+++ b/changelog.d/audio/2904.bugfix.2.rst
@@ -0,0 +1 @@
+:code:`KeyError: loadType` when trying to play tracks has been fixed.
diff --git a/changelog.d/audio/2904.bugfix.3.rst b/changelog.d/audio/2904.bugfix.3.rst
new file mode 100644
index 000000000..bbea88e92
--- /dev/null
+++ b/changelog.d/audio/2904.bugfix.3.rst
@@ -0,0 +1 @@
+``[p]audioset settings`` now uses :code:`ctx.is_owner()` to check if context author is the bot owner.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.dep.1.rst b/changelog.d/audio/2904.dep.1.rst
new file mode 100644
index 000000000..a8b0491e2
--- /dev/null
+++ b/changelog.d/audio/2904.dep.1.rst
@@ -0,0 +1 @@
+New dependency: ``databases[sqlite]`` .
\ No newline at end of file
diff --git a/changelog.d/audio/2904.dep.2.rst b/changelog.d/audio/2904.dep.2.rst
new file mode 100644
index 000000000..dbf929184
--- /dev/null
+++ b/changelog.d/audio/2904.dep.2.rst
@@ -0,0 +1 @@
+``Red-Lavalink`` bumped to version 0.4.0.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.1.rst b/changelog.d/audio/2904.enhance.1.rst
new file mode 100644
index 000000000..484991fa5
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.1.rst
@@ -0,0 +1,2 @@
+``[p]audioset localpath`` can set a path anywhere in your machine now.
+ - Note: This path needs to be visible by :code:`Lavalink.jar`.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.2.rst b/changelog.d/audio/2904.enhance.2.rst
new file mode 100644
index 000000000..377bc911f
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.2.rst
@@ -0,0 +1 @@
+``[p]queue`` now works where there are no tracks in the queue (it shows the current track playing).
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.3.rst b/changelog.d/audio/2904.enhance.3.rst
new file mode 100644
index 000000000..25e24feef
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.3.rst
@@ -0,0 +1 @@
+``[p]audioset settings`` now reports lavalink lib version.
diff --git a/changelog.d/audio/2904.enhance.4.rst b/changelog.d/audio/2904.enhance.4.rst
new file mode 100644
index 000000000..05478b075
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.4.rst
@@ -0,0 +1 @@
+Adding and removing reactions in Audio is no longer a blocking action.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.5.rst b/changelog.d/audio/2904.enhance.5.rst
new file mode 100644
index 000000000..03362ff9e
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.5.rst
@@ -0,0 +1 @@
+When shuffle is on queue now shows correct play order.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.6.rst b/changelog.d/audio/2904.enhance.6.rst
new file mode 100644
index 000000000..d0d48557c
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.6.rst
@@ -0,0 +1 @@
+``[p]seek`` and ``[p]skip`` can be used by user if they are the song requester while DJ mode is enabled, if votes are disabled.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.7.rst b/changelog.d/audio/2904.enhance.7.rst
new file mode 100644
index 000000000..ac882211d
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.7.rst
@@ -0,0 +1 @@
+Adding a playlist and album to a saved playlist skips tracks already in the playlist.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.enhance.8.rst b/changelog.d/audio/2904.enhance.8.rst
new file mode 100644
index 000000000..a24058949
--- /dev/null
+++ b/changelog.d/audio/2904.enhance.8.rst
@@ -0,0 +1 @@
+Turn off DJ mode if the DJ role is deleted.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.1.rst b/changelog.d/audio/2904.feature.1.rst
new file mode 100644
index 000000000..fe7641b1b
--- /dev/null
+++ b/changelog.d/audio/2904.feature.1.rst
@@ -0,0 +1 @@
+``[p]audioset cache`` can be used to set the cache level. **It's off by default**.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.10.rst b/changelog.d/audio/2904.feature.10.rst
new file mode 100644
index 000000000..b68931a33
--- /dev/null
+++ b/changelog.d/audio/2904.feature.10.rst
@@ -0,0 +1 @@
+``[p]genre`` command can be used to play spotify playlist.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.2.rst b/changelog.d/audio/2904.feature.2.rst
new file mode 100644
index 000000000..c7a40961d
--- /dev/null
+++ b/changelog.d/audio/2904.feature.2.rst
@@ -0,0 +1 @@
+``[p]audioset cacheage`` can be used to set maximum age of an entry in the cache. **Default is 365 days**.
diff --git a/changelog.d/audio/2904.feature.3.rst b/changelog.d/audio/2904.feature.3.rst
new file mode 100644
index 000000000..126f416c0
--- /dev/null
+++ b/changelog.d/audio/2904.feature.3.rst
@@ -0,0 +1 @@
+``[p]audioset autoplay`` can be used to enable auto play once the queue runs out.
diff --git a/changelog.d/audio/2904.feature.4.rst b/changelog.d/audio/2904.feature.4.rst
new file mode 100644
index 000000000..7a7a20080
--- /dev/null
+++ b/changelog.d/audio/2904.feature.4.rst
@@ -0,0 +1,12 @@
+New events dispatched by Audio.
+
+ - :code:`on_red_audio_track_start(guild: discord.Guild, track: lavalink.Track, requester: discord.Member)`
+ - :code:`on_red_audio_track_end(guild: discord.Guild, track: lavalink.Track, requester: discord.Member)`
+ - :code:`on_red_audio_track_enqueue(guild: discord.Guild, track: lavalink.Track, requester: discord.Member)`
+ - :code:`on_red_audio_track_auto_play(guild: discord.Guild, track: lavalink.Track, requester: discord.Member)`
+ - :code:`on_red_audio_queue_end(guild: discord.Guild, track: lavalink.Track, requester: discord.Member)`
+ - :code:`on_red_audio_audio_disconnect(guild: discord.Guild)`
+ - :code:`on_red_audio_should_auto_play(guild: discord.Guild, channel: discord.VoiceChannel, play: Callable)`
+ - :code:`on_red_audio_initialized(audio:Cog)`
+ - :code:`on_red_audio_skip_track(guild: discord.Guild, track: lavalink.Track, requester: discord.Member)`
+ - :code:`on_red_audio_unload(audio:Cog)`
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.5.rst b/changelog.d/audio/2904.feature.5.rst
new file mode 100644
index 000000000..51209d660
--- /dev/null
+++ b/changelog.d/audio/2904.feature.5.rst
@@ -0,0 +1 @@
+``[p]queue shuffle`` can be used to shuffle the queue manually.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.6.rst b/changelog.d/audio/2904.feature.6.rst
new file mode 100644
index 000000000..c37957ae4
--- /dev/null
+++ b/changelog.d/audio/2904.feature.6.rst
@@ -0,0 +1 @@
+``[p]queue clean self`` can be used to remove all songs you requested from the queue.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.7.rst b/changelog.d/audio/2904.feature.7.rst
new file mode 100644
index 000000000..ab1b46e0c
--- /dev/null
+++ b/changelog.d/audio/2904.feature.7.rst
@@ -0,0 +1 @@
+``[p]audioset restrictions`` can be used to add or remove keywords which songs must have or are not allowed to have.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.8.rst b/changelog.d/audio/2904.feature.8.rst
new file mode 100644
index 000000000..97202c775
--- /dev/null
+++ b/changelog.d/audio/2904.feature.8.rst
@@ -0,0 +1 @@
+``[p]playlist dedupe`` can be used to remove duplicated tracks from a playlist.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.feature.9.rst b/changelog.d/audio/2904.feature.9.rst
new file mode 100644
index 000000000..9ab73f454
--- /dev/null
+++ b/changelog.d/audio/2904.feature.9.rst
@@ -0,0 +1 @@
+``[p]autoplay`` can be used to play a song.
\ No newline at end of file
diff --git a/changelog.d/audio/2904.misc.1.rst b/changelog.d/audio/2904.misc.1.rst
new file mode 100644
index 000000000..1676ffd84
--- /dev/null
+++ b/changelog.d/audio/2904.misc.1.rst
@@ -0,0 +1 @@
+:class:`red.cogs.audio.localpaths.Query` and :class:`red.cogs.audio.localpaths.LocalPath` have been implemented to handle localtracks and queries.
\ No newline at end of file
diff --git a/changelog.d/audio/2905.enhance.rst b/changelog.d/audio/2905.enhance.rst
new file mode 100644
index 000000000..98ce114c8
--- /dev/null
+++ b/changelog.d/audio/2905.enhance.rst
@@ -0,0 +1 @@
+Remove commas for explanations about how to set API keys.
diff --git a/changelog.d/audio/3059.misc.rst b/changelog.d/audio/3059.misc.rst
new file mode 100644
index 000000000..5988ba3b5
--- /dev/null
+++ b/changelog.d/audio/3059.misc.rst
@@ -0,0 +1 @@
+Fixes badly formatted track name.
\ No newline at end of file
diff --git a/changelog.d/audio/3065.bugfix.rst b/changelog.d/audio/3065.bugfix.rst
new file mode 100644
index 000000000..cb4825bde
--- /dev/null
+++ b/changelog.d/audio/3065.bugfix.rst
@@ -0,0 +1 @@
+Correctly reports the import error when an SQL dependency is missing.
\ No newline at end of file
diff --git a/changelog.d/audio/721.feature.rst b/changelog.d/audio/721.feature.rst
new file mode 100644
index 000000000..ec8ae42a8
--- /dev/null
+++ b/changelog.d/audio/721.feature.rst
@@ -0,0 +1 @@
+Auto pause queue when room is empty.
\ No newline at end of file
diff --git a/changelog.d/bank/.gitignore b/changelog.d/bank/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/bank/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/cleanup/.gitignore b/changelog.d/cleanup/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/cleanup/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/customcom/.gitignore b/changelog.d/customcom/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/customcom/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/customcom/1767.enhance.rst b/changelog.d/customcom/1767.enhance.rst
new file mode 100644
index 000000000..003f5a039
--- /dev/null
+++ b/changelog.d/customcom/1767.enhance.rst
@@ -0,0 +1 @@
+The group command `[p]cc` create can now be used to create simple CCs without specifying "simple".
diff --git a/changelog.d/downloader/.gitignore b/changelog.d/downloader/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/downloader/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/downloader/2827.bugfix.rst b/changelog.d/downloader/2827.bugfix.rst
new file mode 100644
index 000000000..98c6b940d
--- /dev/null
+++ b/changelog.d/downloader/2827.bugfix.rst
@@ -0,0 +1 @@
+Repo names can now only contain the characters listed in the help text (A-Z, 0-9, underscores, and hyphens).
diff --git a/changelog.d/downloader/2902.bugfix.rst b/changelog.d/downloader/2902.bugfix.rst
new file mode 100644
index 000000000..62cbfea63
--- /dev/null
+++ b/changelog.d/downloader/2902.bugfix.rst
@@ -0,0 +1 @@
+findcog no longer attempts to find a cog for commands without one.
\ No newline at end of file
diff --git a/changelog.d/economy/.gitignore b/changelog.d/economy/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/economy/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/filter/.gitignore b/changelog.d/filter/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/filter/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/general/.gitignore b/changelog.d/general/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/general/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/image/.gitignore b/changelog.d/image/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/image/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/image/2905.enhance.2.rst b/changelog.d/image/2905.enhance.2.rst
new file mode 100644
index 000000000..f26d2f70c
--- /dev/null
+++ b/changelog.d/image/2905.enhance.2.rst
@@ -0,0 +1 @@
+Updated the giphycreds command to match the formatting of the other API commands.
diff --git a/changelog.d/image/2905.enhance.rst b/changelog.d/image/2905.enhance.rst
new file mode 100644
index 000000000..98ce114c8
--- /dev/null
+++ b/changelog.d/image/2905.enhance.rst
@@ -0,0 +1 @@
+Remove commas for explanations about how to set API keys.
diff --git a/changelog.d/mod/.gitignore b/changelog.d/mod/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/mod/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/mod/2884.enhance.rst b/changelog.d/mod/2884.enhance.rst
new file mode 100644
index 000000000..7923dcc5c
--- /dev/null
+++ b/changelog.d/mod/2884.enhance.rst
@@ -0,0 +1 @@
+Slowmode now accepts integer only inputs as seconds
diff --git a/changelog.d/mod/2897.misc.rst b/changelog.d/mod/2897.misc.rst
new file mode 100644
index 000000000..47cbdff5e
--- /dev/null
+++ b/changelog.d/mod/2897.misc.rst
@@ -0,0 +1 @@
+Modlog case registration and modlog event handling was moved to the core bot
\ No newline at end of file
diff --git a/changelog.d/mod/2910.bugfix.rst b/changelog.d/mod/2910.bugfix.rst
new file mode 100644
index 000000000..b27f55dcf
--- /dev/null
+++ b/changelog.d/mod/2910.bugfix.rst
@@ -0,0 +1 @@
+userinfo doesn't break with absurd numbers of roles.
\ No newline at end of file
diff --git a/changelog.d/mod/2918.bugfix.rst b/changelog.d/mod/2918.bugfix.rst
new file mode 100644
index 000000000..cafa96097
--- /dev/null
+++ b/changelog.d/mod/2918.bugfix.rst
@@ -0,0 +1 @@
+Fixed Mod cog not recording username changes for ``[p]names`` and ``[p]userinfo`` commands
\ No newline at end of file
diff --git a/changelog.d/mod/2924.fix.rst b/changelog.d/mod/2924.fix.rst
new file mode 100644
index 000000000..38dce73f7
--- /dev/null
+++ b/changelog.d/mod/2924.fix.rst
@@ -0,0 +1 @@
+``modset deletedelay`` doesn't delete non-commands.
\ No newline at end of file
diff --git a/changelog.d/mod/2932.bugfix.rst.txt b/changelog.d/mod/2932.bugfix.rst.txt
new file mode 100644
index 000000000..555c1a375
--- /dev/null
+++ b/changelog.d/mod/2932.bugfix.rst.txt
@@ -0,0 +1 @@
+Fixed an error when reloading the core mod cog
diff --git a/changelog.d/mod/2993.misc.rst b/changelog.d/mod/2993.misc.rst
new file mode 100644
index 000000000..ebf091f2d
--- /dev/null
+++ b/changelog.d/mod/2993.misc.rst
@@ -0,0 +1 @@
+More descriptive tempban unban failure logging
\ No newline at end of file
diff --git a/changelog.d/modlog/.gitignore b/changelog.d/modlog/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/modlog/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/modlog/2945.fix.rst b/changelog.d/modlog/2945.fix.rst
new file mode 100644
index 000000000..a30222b30
--- /dev/null
+++ b/changelog.d/modlog/2945.fix.rst
@@ -0,0 +1 @@
+Remove potential for additional bad API calls per ban/unban
diff --git a/changelog.d/mutes/.gitignore b/changelog.d/mutes/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/mutes/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/permissions/.gitignore b/changelog.d/permissions/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/permissions/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/permissions/2991.enhance.rst b/changelog.d/permissions/2991.enhance.rst
new file mode 100644
index 000000000..efb88ab78
--- /dev/null
+++ b/changelog.d/permissions/2991.enhance.rst
@@ -0,0 +1 @@
+Clear out usage of commands with ```` argument.
diff --git a/changelog.d/reports/.gitignore b/changelog.d/reports/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/reports/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/streams/.gitignore b/changelog.d/streams/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/streams/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/streams/2905.enhance.rst b/changelog.d/streams/2905.enhance.rst
new file mode 100644
index 000000000..98ce114c8
--- /dev/null
+++ b/changelog.d/streams/2905.enhance.rst
@@ -0,0 +1 @@
+Remove commas for explanations about how to set API keys.
diff --git a/changelog.d/trivia/.gitignore b/changelog.d/trivia/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/trivia/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/trivia/12.enhance.rst b/changelog.d/trivia/12.enhance.rst
new file mode 100644
index 000000000..75e88dc5b
--- /dev/null
+++ b/changelog.d/trivia/12.enhance.rst
@@ -0,0 +1 @@
+Add trivia for Prince and Michael Jackson lyrics
diff --git a/changelog.d/trivia/2909.bugfix.rst b/changelog.d/trivia/2909.bugfix.rst
new file mode 100644
index 000000000..6451aa3f2
--- /dev/null
+++ b/changelog.d/trivia/2909.bugfix.rst
@@ -0,0 +1 @@
+Fixes a typo in `Ahsoka Tano`'s name in the starwars trivia
diff --git a/changelog.d/trivia/2911.bugfix.rst b/changelog.d/trivia/2911.bugfix.rst
new file mode 100644
index 000000000..5ba3eea44
--- /dev/null
+++ b/changelog.d/trivia/2911.bugfix.rst
@@ -0,0 +1 @@
+Fixes a bug where ``[p]trivia leaderboard`` failed to run.
\ No newline at end of file
diff --git a/changelog.d/trivia/2994.bugfix.rst b/changelog.d/trivia/2994.bugfix.rst
new file mode 100644
index 000000000..e7204b41e
--- /dev/null
+++ b/changelog.d/trivia/2994.bugfix.rst
@@ -0,0 +1 @@
+Fix typo in the Greek mythology trivia regarding Hermes' staff
diff --git a/changelog.d/trivia/2996.bugfix.rst b/changelog.d/trivia/2996.bugfix.rst
new file mode 100644
index 000000000..8fd6f76fd
--- /dev/null
+++ b/changelog.d/trivia/2996.bugfix.rst
@@ -0,0 +1 @@
+Fixed a question in Overwatch accepting blank responses.
diff --git a/changelog.d/warnings/.gitignore b/changelog.d/warnings/.gitignore
new file mode 100644
index 000000000..b722e9e13
--- /dev/null
+++ b/changelog.d/warnings/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/docs/.resources/code-grant.png b/docs/.resources/code-grant.png
new file mode 100644
index 000000000..764f202bd
Binary files /dev/null and b/docs/.resources/code-grant.png differ
diff --git a/docs/.resources/instances-ssh-button.png b/docs/.resources/instances-ssh-button.png
new file mode 100644
index 000000000..7c678bd89
Binary files /dev/null and b/docs/.resources/instances-ssh-button.png differ
diff --git a/docs/.resources/red-console.png b/docs/.resources/red-console.png
new file mode 100644
index 000000000..fdfcfc68e
Binary files /dev/null and b/docs/.resources/red-console.png differ
diff --git a/docs/.resources/ssh-output.png b/docs/.resources/ssh-output.png
new file mode 100644
index 000000000..7391a214b
Binary files /dev/null and b/docs/.resources/ssh-output.png differ
diff --git a/docs/Makefile b/docs/Makefile
index 49c3b9536..a192210be 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -3,7 +3,7 @@
# You can set these variables from the command line.
SPHINXOPTS =
-SPHINXBUILD = python -msphinx
+SPHINXBUILD = python3 -msphinx
SPHINXPROJ = Red-DiscordBot
SOURCEDIR = .
BUILDDIR = _build
@@ -17,4 +17,4 @@ help:
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/autostart_systemd.rst b/docs/autostart_systemd.rst
index b8d522ccb..1af55e478 100644
--- a/docs/autostart_systemd.rst
+++ b/docs/autostart_systemd.rst
@@ -1,4 +1,4 @@
-.. systemd service guide
+.. _systemd-service-guide:
==============================================
Setting up auto-restart using systemd on Linux
diff --git a/docs/conf.py b/docs/conf.py
index 29afe6380..f1f8b34bc 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -36,11 +36,12 @@ os.environ["BUILDING_DOCS"] = "1"
# ones.
extensions = [
"sphinx.ext.autodoc",
+ "sphinx.ext.extlinks",
"sphinx.ext.intersphinx",
"sphinx.ext.viewcode",
"sphinx.ext.napoleon",
"sphinx.ext.doctest",
- "sphinxcontrib.asyncio",
+ "sphinxcontrib_trio",
]
# Add any paths that contain templates here, relative to this directory.
@@ -65,6 +66,7 @@ author = "Cog Creators"
# built documents.
#
from redbot.core import __version__
+from discord import __version__ as dpy_version
# The short X.Y version.
version = __version__
@@ -92,6 +94,12 @@ todo_include_todos = False
# Role which is assigned when you make a simple reference within backticks
default_role = "any"
+# Includes substitutions for all files
+with open("prolog.txt", "r") as file:
+ rst_prolog = file.read()
+
+# Adds d.py version to available substitutions in all files
+rst_prolog += f"\n.. |DPY_VERSION| replace:: {dpy_version}"
# -- Options for HTML output ----------------------------------------------
@@ -100,6 +108,9 @@ default_role = "any"
#
html_theme = "sphinx_rtd_theme"
+# This will be needed until sphinx_rtd_theme supports the html5 writer
+html4_writer = True
+
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
@@ -203,11 +214,20 @@ linkcheck_ignore = [r"https://java.com*", r"https://chocolatey.org*"]
# Intersphinx
intersphinx_mapping = {
"python": ("https://docs.python.org/3", None),
- "dpy": ("https://discordpy.readthedocs.io/en/v1.0.1/", None),
+ "dpy": (f"https://discordpy.readthedocs.io/en/v{dpy_version}/", None),
"motor": ("https://motor.readthedocs.io/en/stable/", None),
}
+# Extlinks
+# This allows to create links to d.py docs with
+# :dpy_docs:`link text `
+extlinks = {"dpy_docs": (f"https://discordpy.readthedocs.io/en/v{dpy_version}/%s", None)}
+
# Doctest
# If this string is non-empty, all blocks with ``>>>`` in them will be
# tested, not just the ones explicitly marked with ``.. doctest::``
doctest_test_doctest_blocks = ""
+
+# Autodoc options
+autodoc_default_flags = ["show-inheritance"]
+autodoc_typehints = "none"
diff --git a/docs/framework_apikeys.rst b/docs/framework_apikeys.rst
index 86a0a2e2d..bfaadac40 100644
--- a/docs/framework_apikeys.rst
+++ b/docs/framework_apikeys.rst
@@ -18,7 +18,7 @@ and when accessed in the code it should be done by
.. code-block:: python
- await self.bot.db.api_tokens.get_raw("twitch", default={"client_id": None, "client_secret": None})
+ await self.bot.get_shared_api_keys("twitch")
Each service has its own dict of key, value pairs for each required key type. If there's only one key required then a name for the key is still required for storing and accessing.
@@ -30,7 +30,7 @@ and when accessed in the code it should be done by
.. code-block:: python
- await self.bot.db.api_tokens.get_raw("youtube", default={"api_key": None})
+ await self.bot.get_shared_api_keys("youtube")
***********
@@ -42,7 +42,7 @@ Basic Usage
class MyCog:
@commands.command()
async def youtube(self, ctx, user: str):
- apikey = await self.bot.db.api_tokens.get_raw("youtube", default={"api_key": None})
- if apikey["api_key"] is None:
+ youtube_keys = await self.bot.get_shared_api_keys("youtube")
+ if youtube_keys.get("api_key") is None:
return await ctx.send("The YouTube API key has not been set.")
# Use the API key to access content as you normally would
diff --git a/docs/framework_bank.rst b/docs/framework_bank.rst
index 393fff631..9f5e676f8 100644
--- a/docs/framework_bank.rst
+++ b/docs/framework_bank.rst
@@ -16,15 +16,16 @@ Basic Usage
.. code-block:: python
- from redbot.core import bank
+ from redbot.core import bank, commands
+ import discord
- class MyCog:
+ class MyCog(commands.Cog):
@commands.command()
- async def balance(self, ctx, user: discord.Member=None):
+ async def balance(self, ctx, user: discord.Member = None):
if user is None:
user = ctx.author
- bal = bank.get_balance(user)
- currency = bank.get_currency_name(ctx.guild)
+ bal = await bank.get_balance(user)
+ currency = await bank.get_currency_name(ctx.guild)
await ctx.send(
"{}'s balance is {} {}".format(
user.display_name, bal, currency
@@ -40,3 +41,7 @@ Bank
.. automodule:: redbot.core.bank
:members:
+ :exclude-members: cost
+
+ .. autofunction:: cost
+ :decorator:
diff --git a/docs/framework_config.rst b/docs/framework_config.rst
index 96b8d5768..d18aed63b 100644
--- a/docs/framework_config.rst
+++ b/docs/framework_config.rst
@@ -421,15 +421,15 @@ Driver Reference
Base Driver
^^^^^^^^^^^
-.. autoclass:: redbot.core.drivers.red_base.BaseDriver
+.. autoclass:: redbot.core.drivers.BaseDriver
:members:
JSON Driver
^^^^^^^^^^^
-.. autoclass:: redbot.core.drivers.red_json.JSON
+.. autoclass:: redbot.core.drivers.JsonDriver
:members:
Mongo Driver
^^^^^^^^^^^^
-.. autoclass:: redbot.core.drivers.red_mongo.Mongo
+.. autoclass:: redbot.core.drivers.MongoDriver
:members:
diff --git a/docs/framework_modlog.rst b/docs/framework_modlog.rst
index 5baa45ffe..18a9cf453 100644
--- a/docs/framework_modlog.rst
+++ b/docs/framework_modlog.rst
@@ -16,17 +16,17 @@ Basic Usage
.. code-block:: python
- from redbot.core import modlog
+ from redbot.core import commands, modlog
import discord
- class MyCog:
+ class MyCog(commands.Cog):
@commands.command()
@checks.admin_or_permissions(ban_members=True)
- async def ban(self, ctx, user: discord.Member, reason: str=None):
+ async def ban(self, ctx, user: discord.Member, reason: str = None):
await ctx.guild.ban(user)
- case = modlog.create_case(
- ctx.guild, ctx.message.created_at, "ban", user,
- ctx.author, reason, until=None, channel=None
+ case = await modlog.create_case(
+ ctx.bot, ctx.guild, ctx.message.created_at, action="ban",
+ user=user, moderator=ctx.author, reason=reason
)
await ctx.send("Done. It was about time.")
@@ -35,50 +35,60 @@ Basic Usage
Registering Case types
**********************
-To register a single case type:
+To register case types, use an asynchronous ``initialize()`` method and call
+it from your setup function:
.. code-block:: python
- from redbot.core import modlog
+ # mycog/mycog.py
+ from redbot.core import modlog, commands
import discord
- class MyCog:
- def __init__(self, bot):
+ class MyCog(commands.Cog):
+
+ async def initialize(self):
+ await self.register_casetypes()
+
+ @staticmethod
+ async def register_casetypes():
+ # Registering a single casetype
ban_case = {
"name": "ban",
"default_setting": True,
- "image": ":hammer:",
+ "image": "\N{HAMMER}",
"case_str": "Ban",
- "audit_type": "ban"
}
- modlog.register_casetype(**ban_case)
+ try:
+ await modlog.register_casetype(**ban_case)
+ except RuntimeError:
+ pass
-To register multiple case types:
-
-.. code-block:: python
-
- from redbot.core import modlog
- import discord
-
- class MyCog:
- def __init__(self, bot):
+ # Registering multiple casetypes
new_types = [
{
- "name": "ban",
+ "name": "hackban",
"default_setting": True,
- "image": ":hammer:",
- "case_str": "Ban",
- "audit_type": "ban"
+ "image": "\N{BUST IN SILHOUETTE}\N{HAMMER}",
+ "case_str": "Hackban",
},
{
"name": "kick",
"default_setting": True,
- "image": ":boot:",
+ "image": "\N{WOMANS BOOTS}",
"case_str": "Kick",
- "audit_type": "kick"
}
]
- modlog.register_casetypes(new_types)
+ await modlog.register_casetypes(new_types)
+
+.. code-block:: python
+
+ # mycog/__init__.py
+ from .mycog import MyCog
+
+ async def setup(bot):
+ cog = MyCog()
+ await cog.initialize()
+ bot.add_cog(cog)
.. important::
Image should be the emoji you want to represent your case type with.
diff --git a/docs/getting_started.rst b/docs/getting_started.rst
new file mode 100644
index 000000000..6e45d8215
--- /dev/null
+++ b/docs/getting_started.rst
@@ -0,0 +1,360 @@
+.. don't forget to set permissions hyperlink
+ + commands links + guide links
+
+.. _getting-started:
+
+===============
+Getting started
+===============
+
+If you recently installed Red, you should read this.
+This is a quick start guide for a general usage.
+
+.. note::
+
+ If you haven't installed Red, please do it by following
+ the :ref:`installation guides `.
+
+Assuming you correctly installed Red, you should have a
+window like this:
+
+.. image:: .resources/red-console.png
+
+.. _gettings-started-invite:
+
+-------------------------
+Invite Red to your server
+-------------------------
+
+When started, the console will show you ``Invite URL`` (here at
+the bottom of the screenshot).
+Paste the link into your browser and select the server you want
+to invite the bot in, like any other bot.
+
+.. note:: You need the ``Manage server`` permission to add bots.
+
+Complete the captcha, it should tell you ``Authorized!`` and you
+should see your bot in the members list.
+
+.. attention::
+ If Discord shows ``Bot requires code grant``, please untick this
+ option in your token settings
+
+ .. image:: .resources/code-grant.png
+
+.. _getting-started-interact:
+
+-----------------
+Interact with Red
+-----------------
+
+As a chatbot, you interact with Red via the Discord text channels
+(not from the command prompt). To send commands to the bot, you will have to
+use the prefix you set before, followed by the command you want to use. For
+example, if your prefix is ``!``, you will execute your command like this:
+``!ping``.
+
+.. note:: Since the prefix can be anything, it'll be referenced as ``[p]``
+ in documentations.
+
+.. _getting-started-commands:
+
+~~~~~~~~~~~~
+The commands
+~~~~~~~~~~~~
+
+The command you're going to use the most is help. That command will
+show you **all of the available commands** of the bot with a small description.
+
+.. code-block:: none
+
+ [p]help
+
+.. tip:: The message is generated dynamically and users will only see the
+ commands they can use. You can change what commands users can use with the
+ permissions cog.
+
+You can also pick a command to get its detailed description and the
+parameters.
+
+.. code-block:: none
+
+ [p]help command
+
+The parameters are shown as enclosed in ``< >`` if they're required, or
+``[ ]`` if optional.
+As an example, the ban command will show this in the help message, assuming
+your prefix is ``!``:
+``Syntax: !ban [days] [reason]``
+
+This means that it is necessary to provide ``user``. However, the
+``days`` value (number of messages to delete) is optional, as well as
+the ``reason`` value, used for the modlog.
+
+You can use help to show the **categories** too, generally called cogs.
+Just do something like this (notice the capitalization):
+
+.. code-block:: none
+
+ [p]help YourCategory
+
+Help also shows **command groups**. They are group of commands.
+To get the description of a subcommand, type this:
+
+.. code-block:: none
+
+ [p]help commandgroup subcommand
+
+When using subcommands, you also need to specify the command group.
+As an example, ``cleanup`` has 6 subcommands. If you want
+to use one, do it like this: ``[p]cleanup messages 10``
+
+.. _getting-started-cogs:
+
+----
+Cogs
+----
+
+Red is built with cogs, fancy term for plugins. They are
+modules that enhance the Red functionalities. They contain
+commands to use.
+
+Red comes with 19 cogs containing the basic features, such
+as moderation, utility, music, streams...
+
+You can see your loaded and unloaded cogs with the ``[p]cogs``
+command. By default, all cogs will be unloaded.
+
+You can load or unload a cog by using the load or unload command
+
+.. code-block:: none
+
+ [p]load cogname
+ [p]unload cogname
+
+.. tip:: You can load and unload multiple cogs at once:
+
+ .. code-block:: none
+
+ [p]load cog1 cog2 ...
+
+You can enable and disable everything you want, which means you can
+customize Red how you want!
+
+.. _getting-started-community-cogs:
+
+~~~~~~~~~~~~~~
+Community cogs
+~~~~~~~~~~~~~~
+
+There's an entire `community `_ that contributes
+to Red. Those contributors make additional cogs for you to use. You can
+download them using the downloader cog.
+
+You can start using the downloader cog by loading it: ``[p]load downloader``
+
+You can find cogs by searching on ``cogs.red``. Find whatever you want,
+there are hundreds of cogs available!
+
+.. note:: ``cogs.red``, the website that list all of the cogs is not
+ ready for v3 yet. For now, you can refer to `this post
+ `_.
+
+.. 26-cogs not available, let's use my repo :3
+
+Cogs comes with repositories. A repository is a container of cogs
+that you can install. Let's suppose you want to install the ``say``
+cog from the repository ``Laggrons-Dumb-Cogs``. You'll first need
+to install the repository.
+
+.. code-block:: none
+
+ [p]repo add Laggrons-Dumb-Cogs https://github.com/retke/Laggrons-Dumb-Cogs
+
+.. note:: You may need to specify a branch. If so, add its name after the link.
+
+Then you can add the cog
+
+.. code-block:: none
+
+ [p]cog install Laggrons-Dumb-Cogs say
+
+Now the cog is installed, but not loaded. You can load it using the ``[p]load``
+command we talked about before.
+
+.. _getting-started-permissions:
+
+-----------
+Permissions
+-----------
+
+Red works with different levels of permissions. Every cog defines
+the level of permission needed for a command.
+
+~~~~~~~~~
+Bot owner
+~~~~~~~~~
+
+The bot owner can access all commands on every guild. He can also use
+exclusive commands that can interact with the global settings
+or system files.
+
+*You* are the owner by default.
+
+~~~~~~~~~~~~
+Server owner
+~~~~~~~~~~~~
+
+The server owner can access all commands on his guild, except the global
+ones or those who can interact with system files (available for the
+bot owner).
+
+~~~~~~~~~~~~~
+Administrator
+~~~~~~~~~~~~~
+
+The administrator is defined by its roles. You can set multiple admin roles
+with the ``[p]addadminrole`` and ``[p]removeadminrole`` commands.
+
+For example, in the mod cog, an admin can use the ``[p]modset`` command
+which defines the cog settings.
+
+~~~~~~~~~
+Moderator
+~~~~~~~~~
+
+A moderator is a step above the average users. You can set multiple moderator
+roles with the ``[p]addmodrole`` and ``[p]removemodrole`` commands.
+
+For example, in the mod cog (again), a mod will be able to mute, kick and ban;
+but he won't be able to modify the cog settings with the ``[p]modset`` command.
+
+.. tip::
+ If you don't like the default permission settings for some commands or
+ if want to restrict a cog or a command to a channel/member, you can use
+ the permissions cog.
+
+.. _getting-started-hosting:
+
+-------
+Hosting
+-------
+
+If you are hosting Red on your personal computer, you will soon notice that
+if you close the window or if you shut down you computer, Red will be offline.
+She needs an environment to work and respond.
+
+You can try to host Red somewhere she will always be online, like on a virtual
+private server (VPS) or on a personal server (e.g. Raspberry Pi).
+
+If you want to do it, follow these steps.
+
+.. warning::
+ Before trying to host Red on a Linux environment, you need to know the
+ basics of the Unix commands, such as navigating the system files or use
+ a terminal text editor.
+
+ You should follow `this guide
+ `_
+ from DigitalOcean which will introduce you to the Linux basics.
+
+1. **Find a host**
+
+ You need to find a server to host Red. You can rent a VPS (it can be free)
+ on an online service. Please check :ref:`this list ` for
+ quality VPS providers.
+
+ You can also buy a Raspberry Pi (~$20), which is a micro-computer that will
+ be able to host Red. The model 3 or above is recommended.
+
+2. **Install Linux**
+
+ Most of the VPS providers have tools for installing Linux automatically. If
+ you're a beginner, we recommend **Ubuntu 18**.
+
+ For Raspberry Pi users, just install `Raspbian
+ `_ on a micro-SD card.
+
+2.1. **Log in**
+
+ .. note:: This section is for those who have an online server. If you have
+ a local Linux machine, just open the terminal and skip to the next part.
+
+ As we said before, a VPS is controlled through command line. You will have to
+ connect to your VPS through a protocol called SSH.
+
+ .. image:: .resources/instances-ssh-button.png
+
+ On your host page (here, it is Google Cloud), find the SSH button and click on
+ it. You will be connected to your server with command line. You should see
+ something like this.
+
+ .. image:: .resources/ssh-output.png
+
+ .. note:: Don't forget to type the command ``logout`` to close the SSH properly.
+
+3. **Install and set up Red**
+
+ Just follow one of the Linux installation guide. We provide guides for the
+ most used distributions. Check the :ref:`home page ` and search for
+ your distribution.
+
+4. **Set up an auto-restart**
+
+ Once you got Red running on your server, it will still shut down if you close
+ the window. You can set up an auto-restarting system that will create a
+ side task and handle fatal errors, so you can just leave your server running
+ and enjoy Red!
+
+ For that, just follow :ref:`this guide `.
+
+.. _getting-started-userdocs:
+
+------------------
+User documentation
+------------------
+
+You will soon start using the Red core cogs. A detailed documentation is
+available for every core cog, under the :ref:`How to use ` section.
+
+The cog guides are formatted the same. They're divided into 3 sections:
+
+* **Guide**
+
+ This will introduce you to the cog and explain you how it works.
+
+* **Commands**
+
+ A list of the available commands, with details and arguments.
+ Each command guide will be formatted like this:
+
+ * **Syntax**
+
+ A line that will show how the command must be invoked, with the arguments.
+
+ .. tip:: If the command show something like ``[lavalinkset|llset]``, that means
+ you can invoke the command with ``lavalinkset`` or with ``llset``, this is
+ called an alias.
+
+ * **Description**
+
+ A detailed description of what the command does, with details about how
+ it must be used.
+
+ * **Arguments**
+
+ A list of all arguments needed (or not) for the command, with more details.
+
+ .. tip::
+ Arguments enclosed in ``< >`` means that the argument is **required**
+ for the command to work.
+
+ Arguments enclosed in ``[ ]`` means that the argument is **optional**
+ for the command; you can decide to use it or not.
+
+ Arguments followed by ``=something`` means that, if not specified,
+ the argument will be equal to ``something``.
+
+ For example, ``[days=1]`` in the ``ban`` command means that the number
+ of days of messages to be deleted will be equal to ``1`` if not
+ specified.
diff --git a/docs/guide_cog_creation.rst b/docs/guide_cog_creation.rst
index 26fb38fc4..07f6410e5 100644
--- a/docs/guide_cog_creation.rst
+++ b/docs/guide_cog_creation.rst
@@ -18,9 +18,19 @@ Getting started
---------------
To start off, be sure that you have installed Python 3.7.
-Open a terminal or command prompt and type :code:`pip install -U git+https://github.com/Cog-Creators/Red-DiscordBot@V3/develop#egg=redbot[test]`
-(note that if you get an error with this, try again but put :code:`python -m` in front of the command
-This will install the latest version of V3.
+Next, you need to decide if you want to develop against the Stable or Develop version of Red.
+Depending on what your goal is should help determine which version you need.
+
+.. attention::
+ The Develop version may have changes on it which break compatibility with the Stable version and other cogs.
+ If your goal is to support both versions, make sure you build compatibility layers or use separate branches to keep compatibility until the next Red release
+
+Open a terminal or command prompt and type one of the following
+ Stable Version: :code:`python3.7 -m pip install -U Red-DiscordBot`
+
+ Develop Version: :code:`python3.7 -m pip install -U git+https://github.com/Cog-Creators/Red-DiscordBot@V3/develop#egg=Red-DiscordBot`
+
+(Windows users may need to use :code:`py -3.7` or :code:`python` instead of :code:`python3.7`)
--------------------
Setting up a package
@@ -35,6 +45,20 @@ a text editor or IDE (examples include `Sublime Text 3 `_, `Atom `_, and
`PyCharm `_).
+.. attention::
+ While you can intentionally override Red's cogs/extensions, this may break things.
+ We would prefer if people wanted custom behavior
+ for any core cog/extension, an issue and/or PR is made
+ Overriding Permissions specifically is dangerous.
+
+ Subclassing to make changes to Red's cogs/extensions
+ may not be a safe way to stay up to date either,
+ as changes to cogs and their interactions with red
+ are not guaranteed to not be breaking.
+
+ Any cogs doing this are doing so at their own risk,
+ and should also inform users of associated risks.
+
--------------
Creating a cog
--------------
@@ -74,7 +98,7 @@ To test your cog, you will need a running instance of V3.
Assuming you installed V3 as outlined above, run :code:`redbot-setup`
and provide the requested information. Once that's done, run Red
by doing :code:`redbot --dev` to start Red.
-Complete the inital setup by providing a valid token and setting a
+Complete the initial setup by providing a valid token and setting a
prefix. Once the bot has started up, use the link provided in the
console to add it to a server (note that you must have the
:code:`Manage Server` (or :code:`Administrator`) permission to add bots
@@ -85,6 +109,33 @@ to the directory where your cog package is located. In Discord, do
The bot should respond with :code:`I can do stuff!`. If it did, you
have successfully created a cog!
+.. note:: **Package/Folder layout**
+
+ You must make sure you structure your local path correctly or
+ you get an error about missing the setup function. As cogs are
+ considered packages, they are each contained within separate folders.
+ The folder you need to add using :code:`[p]addpath` is the parent
+ folder of these package folders. Below is an example
+
+ .. code-block:: none
+
+ - D:\
+ -- red-env
+ -- red-data
+ -- red-cogs
+ ---- mycog
+ ------ __init__.py
+ ------ mycog.py
+ ---- coolcog
+ ------ __init__.py
+ ------ coolcog.py
+
+ You would then use :code:`[p]addpath D:\red-cogs` to add the path
+ and then you can use :code:`[p]load mycog` or :code:`[p]load coolcog`
+ to load them
+
+ You can also take a look at `our cookiecutter `_, for help creating the right structure.
+
--------------------
Additional resources
--------------------
diff --git a/docs/guide_migration.rst b/docs/guide_migration.rst
index c41009013..3d37f6c17 100644
--- a/docs/guide_migration.rst
+++ b/docs/guide_migration.rst
@@ -7,7 +7,7 @@
Migrating Cogs to V3
====================
-First, be sure to read `discord.py's migration guide `_
+First, be sure to read :dpy_docs:`discord.py's migration guide `
as that covers all of the changes to discord.py that will affect the migration process
----------------
diff --git a/docs/host-list.rst b/docs/host-list.rst
new file mode 100644
index 000000000..47398d898
--- /dev/null
+++ b/docs/host-list.rst
@@ -0,0 +1,81 @@
+.. source: https://gist.github.com/Twentysix26/cb4401c6e507782aa6698e9e470243ed
+
+.. _host-list:
+
+=============
+VPS providers
+=============
+
+.. note::
+ This doc is written for the :ref:`hosting section `
+ of the :ref:`getting started ` guide. Please take a look
+ if you don't know how to host Red on a VPS.
+
+This is a list of the recommended VPS providers.
+
+.. warning::
+ Please be aware that a Linux server is controlled through a command line.
+ If you don't know Unix basics, please take a look at `this guide
+ `_
+ from DigitalOcean which will introduce you to the Linux basics.
+
+-------------
+Linux hosting
+-------------
+
++------------------------------------+------------------------------------------------------+
+|Link |Description |
++====================================+======================================================+
+|`Scaleway |Incredibly cheap but powerful VPSes, owned by |
+|`_ |``_, based in Europe. |
++------------------------------------+------------------------------------------------------+
+|`DigitalOcean |US-based cheap VPSes. The gold standard. Locations |
+|`_ |available world wide. |
++------------------------------------+------------------------------------------------------+
+|`OVH `_ |Cheap VPSes, used by many people. French and Canadian |
+| |locations available. |
++------------------------------------+------------------------------------------------------+
+|`Time4VPS |Cheap VPSes, seemingly based in Lithuania. |
+|`_ | |
++------------------------------------+------------------------------------------------------+
+|`Linode `_ |More cheap VPSes! |
++------------------------------------+------------------------------------------------------+
+|`Vultr `_ |US-based, DigitalOcean-like. |
++------------------------------------+------------------------------------------------------+
+
+------
+Others
+------
+
++-------------------------------------+-----------------------------------------------------+
+|Link | |
++=====================================+=====================================================+
+|`AWS `_ |Amazon Web Services. Free for a year (with certain |
+| |limits), but very pricey after that. |
++-------------------------------------+-----------------------------------------------------+
+|`Google Cloud |Same as AWS, but it's Google. |
+|`_| |
++-------------------------------------+-----------------------------------------------------+
+|`LowEndBox `_ |A curator for lower specced servers. |
++-------------------------------------+-----------------------------------------------------+
+
+------------
+Self-hosting
+------------
+
+You can always self-host on your own hardware.
+A Raspberry Pi 3 will be more than sufficient for small to medium sized bots.
+
+For bigger bots, you can build your own server PC for usage, or buy a rack
+server. Any modern hardware should work 100% fine.
+
+------------
+Free hosting
+------------
+
+Google Cloud and AWS both have free tier VPS suitable for small bots.
+Additionally, new Google Cloud customers get a $300 credit which is valid
+for 12 months.
+
+Other than that... no. There is no good free VPS hoster, outside of
+persuading somebody to host for you, which is incredibly unlikely.
diff --git a/docs/index.rst b/docs/index.rst
index 747a2994f..bcec8b9f2 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -3,6 +3,8 @@
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
+.. _main:
+
Welcome to Red - Discord Bot's documentation!
=============================================
@@ -23,6 +25,12 @@ Welcome to Red - Discord Bot's documentation!
cog_downloader
cog_permissions
+.. toctree::
+ :maxdepth: 2
+ :caption: User guides:
+
+ getting_started
+
.. toctree::
:maxdepth: 2
:caption: Red Development Framework Reference:
@@ -43,6 +51,7 @@ Welcome to Red - Discord Bot's documentation!
framework_modlog
framework_rpc
framework_utils
+ version_guarantees
.. toctree::
:maxdepth: 2
@@ -50,6 +59,12 @@ Welcome to Red - Discord Bot's documentation!
changelog_3_1_0
+.. toctree::
+ :maxdepth: 2
+ :caption: Others
+
+ host-list
+
Indices and tables
==================
diff --git a/docs/install_linux_mac.rst b/docs/install_linux_mac.rst
index 22d0c492e..fac383b88 100644
--- a/docs/install_linux_mac.rst
+++ b/docs/install_linux_mac.rst
@@ -7,7 +7,8 @@ Installing Red on Linux or Mac
.. warning::
For safety reasons, DO NOT install Red with a root user. If you are unsure how to create
- a new user, see the man page for the ``useradd`` command.
+ a new user on Linux, see `this guide by DigitalOcean
+ `_.
-------------------------------
Installing the pre-requirements
@@ -17,10 +18,13 @@ Please install the pre-requirements using the commands listed for your operating
The pre-requirements are:
- Python 3.7.0 or greater
- - pip 9.0 or greater
- - git
+ - Pip 9.0 or greater
+ - Git
- Java Runtime Environment 8 or later (for audio support)
+We also recommend installing some basic compiler tools, in case our dependencies don't provide
+pre-built "wheels" for your architecture.
+
.. _install-arch:
~~~~~~~~~~
@@ -29,48 +33,71 @@ Arch Linux
.. code-block:: none
- sudo pacman -Syu python-pip git base-devel jre8-openjdk
+ sudo pacman -Syu python python-pip git jre-openjdk-headless base-devel
.. _install-centos:
-.. _install-fedora:
.. _install-rhel:
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-CentOS 7, Fedora, and RHEL
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~
+CentOS and RHEL 7
+~~~~~~~~~~~~~~~~~
.. code-block:: none
yum -y groupinstall development
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel \
- openssl-devel xz xz-devel libffi-devel git2u java-1.8.0-openjdk
+ openssl-devel xz xz-devel libffi-devel findutils git2u java-1.8.0-openjdk
Complete the rest of the installation by `installing Python 3.7 with pyenv `.
.. _install-debian:
.. _install-raspbian:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~
+Debian and Raspbian
+~~~~~~~~~~~~~~~~~~~
+
+Debian and Raspbian Buster
+**************************
+
+Debian and Raspbian Buster have all required packages available in official repositories. Install
+them with apt:
+
+.. code-block:: none
+
+ sudo apt update
+ sudo apt install python3 python3-dev python3-venv python3-pip git default-jre-headless \
+ build-essential
+
Debian and Raspbian Stretch
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. warning::
-
- Audio will not work on Raspberry Pi's **below** 2B. This is a CPU problem and
- *cannot* be fixed.
+***************************
We recommend installing pyenv as a method of installing non-native versions of python on
Debian/Raspbian Stretch. This guide will tell you how. First, run the following commands:
.. code-block:: none
- sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
- libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
- xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git unzip default-jre
+ sudo apt update
+ sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
+ libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \
+ liblzma-dev python3-openssl git default-jre-headless
Complete the rest of the installation by `installing Python 3.7 with pyenv `.
+.. _install-fedora:
+
+~~~~~~~~~~~~
+Fedora Linux
+~~~~~~~~~~~~
+
+Fedora Linux 29 and above has all required packages available in official repositories. Install
+them with dnf:
+
+.. code-block:: none
+
+ sudo dnf install python3 python3-devel git java-latest-openjdk-headless @development-tools
+
.. _install-mac:
~~~
@@ -94,42 +121,83 @@ one-by-one:
brew tap caskroom/versions
brew cask install homebrew/cask-versions/adoptopenjdk8
-It's possible you will have network issues. If so, go in your Applications folder, inside it, go in the Python 3.7 folder then double click ``Install certificates.command``
+It's possible you will have network issues. If so, go in your Applications folder, inside it, go in
+the Python 3.7 folder then double click ``Install certificates.command``.
+
+.. _install-opensuse:
+
+~~~~~~~~
+openSUSE
+~~~~~~~~
+
+openSUSE Leap
+*************
+
+We recommend installing a community package to get Python 3.7 on openSUSE Leap. This package will
+be installed to the ``/opt`` directory.
+
+First, add the Opt-Python community repository:
+
+.. code-block:: none
+
+ source /etc/os-release
+ sudo zypper ar -f https://download.opensuse.org/repositories/home:/Rotkraut:/Opt-Python/openSUSE_Leap_${VERSION_ID}/ Opt-Python
+
+Now install the pre-requirements with zypper:
+
+.. code-block:: none
+
+ sudo zypper install opt-python37 opt-python37-setuptools git-core java-11-openjdk-headless
+ sudo zypper install -t pattern devel_basis
+
+Since Python is now installed to ``/opt/python``, we should add it to PATH. You can add a file in
+``/etc/profile.d/`` to do this:
+
+.. code-block:: none
+
+ echo 'export PATH="/opt/python/bin:$PATH"' | sudo tee /etc/profile.d/opt-python.sh
+ source /etc/profile.d/opt-python.sh
+
+Now, install pip with easy_install:
+
+.. code-block:: none
+
+ sudo /opt/python/bin/easy_install-3.7 pip
+
+openSUSE Tumbleweed
+*******************
+
+openSUSE Tumbleweed has all required dependencies available in official repositories. Install them
+with zypper:
+
+.. code-block:: none
+
+ sudo zypper install python3-base python3-pip git-core java-12-openjdk-headless
+ sudo zypper install -t pattern devel_basis
.. _install-ubuntu:
-.. _install-ubuntu-bionic:
-.. _install-ubuntu-cosmic:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Ubuntu 18.04 Bionic Beaver and 18.10 Cosmic Cuttlefish
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~
+Ubuntu
+~~~~~~
+
+.. note:: **Ubuntu 16.04 Users**
+
+ You must add a 3rd-party repository to install Python 3.7 on Ubuntu 16.04 with apt. We
+ recommend the ``deadsnakes`` repository:
+
+ .. code-block:: none
+
+ sudo apt install software-properties-common
+ sudo add-apt-repository ppa:deadsnakes/ppa
+
+Install the pre-requirements with apt:
.. code-block:: none
- sudo apt install python3.7 python3.7-dev python3.7-venv python3-pip build-essential \
- libssl-dev libffi-dev git unzip default-jre -y
-
-.. _install-ubuntu-xenial:
-
-~~~~~~~~~~~~~~~~~~~~~~~~~
-Ubuntu 16.04 Xenial Xerus
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-We recommend adding the ``deadsnakes`` apt repository to install Python 3.7 or greater:
-
-.. code-block:: none
-
- sudo apt install software-properties-common
- sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
-
-Now, install python, pip, git and java with the following commands:
-
-.. code-block:: none
-
- sudo apt install python3.7 python3.7-dev build-essential libssl-dev libffi-dev git \
- unzip default-jre curl -y
- curl https://bootstrap.pypa.io/get-pip.py | sudo python3.7
+ sudo apt install python3.7 python3.7-dev python3.7-venv python3-pip git default-jre-headless \
+ build-essential
.. _install-python-pyenv:
@@ -137,6 +205,11 @@ Now, install python, pip, git and java with the following commands:
Installing Python with pyenv
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. note::
+
+ If you followed one of the sections above, and weren't linked here afterwards, you should skip
+ this section.
+
On distributions where Python 3.7 needs to be compiled from source, we recommend the use of pyenv.
This simplifies the compilation process and has the added bonus of simplifying setting up Red in a
virtual environment.
@@ -152,7 +225,7 @@ Then run the following command:
.. code-block:: none
- CONFIGURE_OPTS=--enable-optimizations pyenv install 3.7.2 -v
+ CONFIGURE_OPTS=--enable-optimizations pyenv install 3.7.4 -v
This may take a long time to complete, depending on your hardware. For some machines (such as
Raspberry Pis and micro-tier VPSes), it may take over an hour; in this case, you may wish to remove
@@ -164,7 +237,7 @@ After that is finished, run:
.. code-block:: none
- pyenv global 3.7.2
+ pyenv global 3.7.4
Pyenv is now installed and your system should be configured to run Python 3.7.
@@ -172,8 +245,8 @@ Pyenv is now installed and your system should be configured to run Python 3.7.
Creating a Virtual Environment
------------------------------
-We **strongly** recommend installing Red into a virtual environment. See the section
-`installing-in-virtual-environment`.
+We **strongly** recommend installing Red into a virtual environment. Don't be scared, it's very
+straightforward. See the section `installing-in-virtual-environment`.
.. _installing-red-linux-mac:
@@ -186,7 +259,11 @@ Choose one of the following commands to install Red.
.. note::
If you're not inside an activated virtual environment, include the ``--user`` flag with all
- ``python3.7 -m pip`` commands.
+ ``python3.7 -m pip install`` commands, like this:
+
+ .. code-block:: none
+
+ python3.7 -m pip install --user -U Red-DiscordBot
To install without MongoDB support:
@@ -200,6 +277,12 @@ Or, to install with MongoDB support:
python3.7 -m pip install -U Red-DiscordBot[mongo]
+Or, to install with PostgreSQL support:
+
+.. code-block:: none
+
+ python3.7 -m pip install -U Red-DiscordBot[postgres]
+
.. note::
To install the development version, replace ``Red-DiscordBot`` in the above commands with the
@@ -231,14 +314,9 @@ Once done setting up the instance, run the following command to run Red:
It will walk through the initial setup, asking for your token and a prefix.
You can find out how to obtain a token with
-`this guide `_,
+:dpy_docs:`this guide `,
section "Creating a Bot Account".
-You may also run Red via the launcher, which allows you to restart the bot
-from discord, and enable auto-restart. You may also update the bot from the
-launcher menu. Use the following command to run the launcher:
-
-.. code-block:: none
-
- redbot-launcher
-
+.. tip::
+ If it's the first time you're using Red, you should check our `getting-started` guide
+ that will walk you through all essential information on how to interact with Red.
diff --git a/docs/install_windows.rst b/docs/install_windows.rst
index d913cdb48..5c4862958 100644
--- a/docs/install_windows.rst
+++ b/docs/install_windows.rst
@@ -8,8 +8,8 @@ Installing Red on Windows
Needed Software
---------------
-The following software dependencies can all be installed quickly and easily through powershell,
-using a trusted package manager for windows called `Chocolatey `_
+The following software dependencies can all be installed quickly and easily through PowerShell,
+using a trusted package manager for Windows called `Chocolatey `_
We also provide instructions for manually installing all of the dependencies.
@@ -17,7 +17,7 @@ We also provide instructions for manually installing all of the dependencies.
Installing using powershell and chocolatey
******************************************
-To install via powershell, search "powershell" in the windows start menu,
+To install via PowerShell, search "powershell" in the Windows start menu,
right-click on it and then click "Run as administrator"
Then run each of the following commands:
@@ -29,6 +29,7 @@ Then run each of the following commands:
choco install git --params "/GitOnlyOnPath /WindowsTerminal" -y
choco install jre8 python -y; exit
+From here, continue onto `installing Red `.
********************************
Manually installing dependencies
@@ -36,16 +37,16 @@ Manually installing dependencies
* `Python `_ - Red needs Python 3.7.0 or greater
-.. note:: Please make sure that the box to add Python to PATH is CHECKED, otherwise
- you may run into issues when trying to run Red
+.. attention:: Please make sure that the box to add Python to PATH is CHECKED, otherwise
+ you may run into issues when trying to run Red.
* `Git `_
-.. attention:: Please choose the option to "Run Git from the Windows Command Prompt" in Git's setup
+.. attention:: Please choose the option to "Git from the command line and also from 3rd-party software" in Git's setup.
* `Java `_ - needed for Audio
-.. attention:: Please choose the "Windows Online" installer
+.. attention:: Please choose the "Windows Online" installer.
.. _installing-red-windows:
@@ -53,16 +54,23 @@ Manually installing dependencies
Installing Red
--------------
+.. attention:: You may need to restart your computer after installing dependencies
+ for the PATH changes to take effect.
+
1. Open a command prompt (open Start, search for "command prompt", then click it)
2. Create and activate a virtual environment (strongly recommended), see the section `using-venv`
3. Run **one** of the following commands, depending on what extras you want installed
.. note::
- If you're not inside an activated virtual environment, include the ``--user`` flag with all
- ``pip`` commands.
+ If you're not inside an activated virtual environment, use ``py -3.7`` in place of
+ ``python``, and include the ``--user`` flag with all ``pip install`` commands, like this:
- * No MongoDB support:
+ .. code-block:: none
+
+ py -3.7 -m pip install --user -U Red-DiscordBot
+
+ * Normal installation:
.. code-block:: none
@@ -74,6 +82,12 @@ Installing Red
python -m pip install -U Red-DiscordBot[mongo]
+ * With PostgreSQL support:
+
+ .. code-block:: none
+
+ python3.7 -m pip install -U Red-DiscordBot[postgres]
+
.. note::
To install the development version, replace ``Red-DiscordBot`` in the above commands with the
@@ -105,13 +119,9 @@ Once done setting up the instance, run the following command to run Red:
It will walk through the initial setup, asking for your token and a prefix.
You can find out how to obtain a token with
-`this guide `_,
+:dpy_docs:`this guide `,
section "Creating a Bot Account".
-You may also run Red via the launcher, which allows you to restart the bot
-from discord, and enable auto-restart. You may also update the bot from the
-launcher menu. Use the following command to run the launcher:
-
-.. code-block:: none
-
- redbot-launcher
+.. tip::
+ If it's the first time you're using Red, you should check our `getting-started` guide
+ that will walk you through all essential information on how to interact with Red.
diff --git a/docs/prolog.txt b/docs/prolog.txt
new file mode 100644
index 000000000..3b75c347a
--- /dev/null
+++ b/docs/prolog.txt
@@ -0,0 +1,41 @@
+.. This file will be run at the beginning of all files.
+ You can add the subsitutions you need.
+
+.. this is a .txt so sphinx doesn't error because it's
+ missing in the index
+
+
+.. These are the comments for permissions locks
+
+.. |owner-lock| replace:: This command is locked to the
+ :ref:`bot owner `.
+
+.. |guildowner-lock| replace:: This command is locked to the
+ :ref:`server owner `.
+
+.. |admin-lock| replace:: This command is locked to the
+ :ref:`admin role `.
+
+.. |mod-lock| replace:: This command is locked to the
+ :ref:`mod role `.
+
+
+.. This is for describing how a format should be formatted
+
+.. |quotes| replace:: enclosed in quotes if there are spaces
+
+.. |role-input| replace:: Please give **the exact role name or ID**, or it won't be detected.
+ If the role name has spaces, provide it enclosed in quotes like this: ``"my role with spaces"``
+
+.. |member-input| replace:: You can either mention the member, provide its ID, its exact name with
+ the tag or not, or its nickname (|quotes|).
+
+.. |user-input| replace:: You can either provide the member's ID or its exact name with the tag or
+ not (|quotes|).
+
+.. |channel-input| replace:: You can either mention the channel, provide its exact name or its ID.
+
+.. |vc-input| replace:: You can either provide the voice channel's ID or its exact name, |quotes|.
+
+.. |color-input| replace:: You can either provide the hexadecimal code of the color, or one of the
+ colors listed here: :class:`discord.Color`.
diff --git a/docs/venv_guide.rst b/docs/venv_guide.rst
index 636fb7435..59cb97398 100644
--- a/docs/venv_guide.rst
+++ b/docs/venv_guide.rst
@@ -3,9 +3,23 @@
=======================================
Installing Red in a Virtual Environment
=======================================
+Creating a virtual environment is really easy and usually prevents many common installation
+problems. Firstly, simply choose how you'd like to create your virtual environment:
+
+* :ref:`using-venv` (quick and easy, involves two commands)
+* :ref:`using-pyenv-virtualenv` (recommended if you installed Python with pyenv)
+
+**Why Should I Use a Virtual Environment?**
+
+90% of the installation and setup issues raised in our support channels are resolved when the user
+creates a virtual environment.
+
+**What Are Virtual Environments For?**
+
Virtual environments allow you to isolate red's library dependencies, cog dependencies and python
-binaries from the rest of your system. It is strongly recommended you use this if you use python
-for more than just Red.
+binaries from the rest of your system. It also makes sure Red and its dependencies are installed to
+a predictable location. It makes uninstalling Red as simple as removing a single folder, without
+worrying about losing your data or other things on your system becoming broken.
.. _using-venv:
@@ -17,18 +31,18 @@ python.
First, choose a directory where you would like to create your virtual environment. It's a good idea
to keep it in a location which is easy to type out the path to. From now, we'll call it
-``path/to/venv/`` (or ``path\to\venv\`` on Windows).
+``redenv``.
~~~~~~~~~~~~~~~~~~~~~~~~
``venv`` on Linux or Mac
~~~~~~~~~~~~~~~~~~~~~~~~
Create your virtual environment with the following command::
- python3.7 -m venv path/to/venv/
+ python3.7 -m venv redenv
And activate it with the following command::
- source path/to/venv/bin/activate
+ source redenv/bin/activate
.. important::
@@ -42,11 +56,11 @@ Continue reading `below `.
~~~~~~~~~~~~~~~~~~~
Create your virtual environment with the following command::
- python -m venv path\to\venv\
+ py -3.7 -m venv redenv
And activate it with the following command::
- path\to\venv\Scripts\activate.bat
+ redenv\Scripts\activate.bat
.. important::
@@ -86,7 +100,8 @@ Now activate your virtualenv with the following command::
.. important::
You must activate the virtual environment with the above command every time you open a new
- shell to run, install or update Red.
+ shell to run, install or update Red. You can check out other commands like ``pyenv local`` and
+ ``pyenv global`` if you wish to keep the virtualenv activated all the time.
Continue reading `below `.
diff --git a/docs/version_guarantees.rst b/docs/version_guarantees.rst
new file mode 100644
index 000000000..247fe6a83
--- /dev/null
+++ b/docs/version_guarantees.rst
@@ -0,0 +1,36 @@
+.. _version-guarantees:
+
+==========
+Versioning
+==========
+
+Red is versioned as ``major.minor.micro``
+
+While this is very similar to SemVer, we have our own set of guarantees.
+
+Major versions are for project wide rewrites and are not expected in the foreseeable future.
+
+==========
+Guarantees
+==========
+
+Anything in the ``redbot.core`` module or any of its submodules
+which is not private (even if not documented) should not break without notice.
+
+Anything in the ``redbot.cogs`` module or any of it's submodules is specifically
+excluded from being guaranteed.
+
+If you would like something in here to be guaranteed,
+open an issue making a case for it to be moved.
+
+=======================
+Breaking Change Notices
+=======================
+
+Breaking changes in Red will be noted in the changelog with a special section.
+
+Breaking changes may only occur on a minor or major version bump.
+
+A change not covered by our guarantees may not be considered breaking for these purposes,
+while still being documented as a breaking change in internal documentation
+for the purposes of other internal APIs.
diff --git a/make.bat b/make.bat
index 58ec5a985..1e38b16e7 100644
--- a/make.bat
+++ b/make.bat
@@ -14,13 +14,28 @@ for /F "tokens=* USEBACKQ" %%A in (`git ls-files "*.py"`) do (
goto %1
:reformat
-black -l 99 !PYFILES!
+black -l 99 --target-version py37 !PYFILES!
exit /B %ERRORLEVEL%
:stylecheck
-black -l 99 --check !PYFILES!
+black -l 99 --check --target-version py37 !PYFILES!
exit /B %ERRORLEVEL%
+:newenv
+py -3.7 -m venv --clear .venv
+.\.venv\Scripts\python -m pip install -U pip setuptools
+goto syncenv
+
+:syncenv
+.\.venv\Scripts\python -m pip install -Ur .\tools\dev-requirements.txt
+exit /B %ERRORLEVEL%
+
+:checkchangelog
+REM This should be written for windows at some point I guess.
+REM If we can swith to powershell, it can make this much easier.
+echo This doesn^'t do anything on windows ^(yet^)
+exit /b 0
+
:help
echo Usage:
echo make ^
@@ -28,3 +43,6 @@ echo.
echo Commands:
echo reformat Reformat all .py files being tracked by git.
echo stylecheck Check which tracked .py files need reformatting.
+echo newenv Create or replace this project's virtual environment.
+echo syncenv Sync this project's virtual environment to Red's latest
+echo dependencies.
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..0b98577f9
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,125 @@
+[tool.towncrier]
+ package = "redbot"
+ filename = "CHANGELOG.rst"
+ directory = "changelog.d"
+ issue_format = "`#{issue} `_"
+
+ [[tool.towncrier.section]]
+ path = ""
+ name = "Core Bot Changes"
+
+ [[tool.towncrier.section]]
+ path = "admin"
+ name = "Admin"
+
+ [[tool.towncrier.section]]
+ path = "alias"
+ name = "Alias"
+
+ [[tool.towncrier.section]]
+ path = "audio"
+ name = "Audio"
+
+ [[tool.towncrier.section]]
+ path = "bank"
+ name = "Bank"
+
+ [[tool.towncrier.section]]
+ path = "cleanup"
+ name = "Cleanup"
+
+ [[tool.towncrier.section]]
+ path = "customcom"
+ name = "CustomCom"
+
+ [[tool.towncrier.section]]
+ path = "downloader"
+ name = "Downloader"
+
+ [[tool.towncrier.section]]
+ path = "economy"
+ name = "Economy"
+
+ [[tool.towncrier.section]]
+ path = "filter"
+ name = "Filter"
+
+ [[tool.towncrier.section]]
+ path = "general"
+ name = "General"
+
+ [[tool.towncrier.section]]
+ path = "image"
+ name = "Image"
+
+ [[tool.towncrier.section]]
+ path = "mod"
+ name = "Mod"
+
+ [[tool.towncrier.section]]
+ path = "modlog"
+ name = "ModLog"
+
+ [[tool.towncrier.section]]
+ path = "mutes"
+ name = "Mutes"
+
+ [[tool.towncrier.section]]
+ path = "permissions"
+ name = "Permissions"
+
+ [[tool.towncrier.section]]
+ path = "reports"
+ name = "Reports"
+
+ [[tool.towncrier.section]]
+ path = "streams"
+ name = "Streams"
+
+ [[tool.towncrier.section]]
+ path = "trivia"
+ name = "Trivia"
+
+ [[tool.towncrier.section]]
+ path = "warnings"
+ name = "Warnings"
+
+ [[tool.towncrier.type]]
+ directory = "breaking"
+ name = "Breaking Changes"
+ showcontent = true
+
+ [[tool.towncrier.type]]
+ directory = "bugfix"
+ name = "Bug Fixes"
+ showcontent = true
+
+ [[tool.towncrier.type]]
+ directory = "enhance"
+ name = "Enhancements"
+ showcontent = true
+
+ [[tool.towncrier.type]]
+ directory = "feature"
+ name = "New Feature"
+ showcontent = true
+
+ [[tool.towncrier.type]]
+ directory = "removal"
+ name = "Removals"
+ showcontent = true
+
+ [[tool.towncrier.type]]
+ directory = "misc"
+ name = "Miscellaneous changes"
+ showcontent = false
+
+ [[tool.towncrier.type]]
+ directory = "dep"
+ name = "Changes to dependencies"
+ showcontent = true
+
+ [[tool.towncrier.type]]
+ directory = "docs"
+ name = "Documentation Changes"
+ showcontent = true
diff --git a/redbot/__init__.py b/redbot/__init__.py
index dcc031cac..fffb3af7c 100644
--- a/redbot/__init__.py
+++ b/redbot/__init__.py
@@ -3,7 +3,6 @@ import sys as _sys
import warnings as _warnings
from math import inf as _inf
from typing import (
- Any as _Any,
ClassVar as _ClassVar,
Dict as _Dict,
List as _List,
@@ -174,7 +173,7 @@ class VersionInfo:
)
-__version__ = "3.1.1"
+__version__ = "3.1.6"
version_info = VersionInfo.from_str(__version__)
# Filter fuzzywuzzy slow sequence matcher warning
diff --git a/redbot/__main__.py b/redbot/__main__.py
index 92793ab56..a195e26a4 100644
--- a/redbot/__main__.py
+++ b/redbot/__main__.py
@@ -3,26 +3,20 @@
# Discord Version check
import asyncio
+import json
import logging
import os
import sys
import discord
-import redbot.logging
-from redbot.core.bot import Red, ExitCodes
-from redbot.core.cog_manager import CogManagerUI
-from redbot.core.json_io import JsonIO
-from redbot.core.global_checks import init_global_checks
-from redbot.core.events import init_events
-from redbot.core.cli import interactive_config, confirm, parse_cli_flags
-from redbot.core.core_commands import Core
-from redbot.core.dev_commands import Dev
-from redbot.core import __version__, modlog, bank, data_manager
-from signal import SIGTERM
-
-# Let's not force this dependency, uvloop is much faster on cpython
-if sys.implementation.name == "cpython":
+# Set the event loop policies here so any subsequent `get_event_loop()`
+# calls, in particular those as a result of the following imports,
+# return the correct loop object.
+if sys.platform == "win32":
+ asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
+elif sys.implementation.name == "cpython":
+ # Let's not force this dependency, uvloop is much faster on cpython
try:
import uvloop
except ImportError:
@@ -31,8 +25,17 @@ if sys.implementation.name == "cpython":
else:
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
-if sys.platform == "win32":
- asyncio.set_event_loop(asyncio.ProactorEventLoop())
+import redbot.logging
+from redbot.core.bot import Red, ExitCodes
+from redbot.core.cog_manager import CogManagerUI
+from redbot.core.global_checks import init_global_checks
+from redbot.core.events import init_events
+from redbot.core.cli import interactive_config, confirm, parse_cli_flags
+from redbot.core.core_commands import Core
+from redbot.core.dev_commands import Dev
+from redbot.core import __version__, modlog, bank, data_manager, drivers
+from signal import SIGTERM
+
log = logging.getLogger("red.main")
@@ -49,8 +52,8 @@ async def _get_prefix_and_token(red, indict):
:param indict:
:return:
"""
- indict["token"] = await red.db.token()
- indict["prefix"] = await red.db.prefix()
+ indict["token"] = await red._config.token()
+ indict["prefix"] = await red._config.prefix()
def list_instances():
@@ -61,7 +64,8 @@ def list_instances():
)
sys.exit(1)
else:
- data = JsonIO(data_manager.config_file)._load_json()
+ with data_manager.config_file.open(encoding="utf-8") as fs:
+ data = json.load(fs)
text = "Configured Instances:\n\n"
for instance_name in sorted(data.keys()):
text += "{}\n".format(instance_name)
@@ -75,7 +79,7 @@ async def sigterm_handler(red, log):
def main():
- description = "Red V3"
+ description = "Red V3 (c) Cog Creators"
cli_flags = parse_cli_flags(sys.argv[1:])
if cli_flags.list_instances:
list_instances()
@@ -95,7 +99,11 @@ def main():
)
cli_flags.instance_name = "temporary_red"
data_manager.create_temp_config()
+ loop = asyncio.get_event_loop()
+
data_manager.load_basic_configuration(cli_flags.instance_name)
+ driver_cls = drivers.get_driver_class()
+ loop.run_until_complete(driver_cls.initialize(**data_manager.storage_details()))
redbot.logging.init_logging(
level=cli_flags.logging_level, location=data_manager.core_data_path() / "logs"
)
@@ -107,17 +115,26 @@ def main():
red = Red(
cli_flags=cli_flags, description=description, dm_help=None, fetch_offline_members=True
)
+ loop.run_until_complete(red._maybe_update_config())
init_global_checks(red)
init_events(red, cli_flags)
+
+ # lib folder has to be in sys.path before trying to load any 3rd-party cog (GH-3061)
+ # We might want to change handling of requirements in Downloader at later date
+ LIB_PATH = data_manager.cog_data_path(raw_name="Downloader") / "lib"
+ LIB_PATH.mkdir(parents=True, exist_ok=True)
+ if str(LIB_PATH) not in sys.path:
+ sys.path.append(str(LIB_PATH))
+
red.add_cog(Core(red))
red.add_cog(CogManagerUI())
if cli_flags.dev:
red.add_cog(Dev())
# noinspection PyProtectedMember
- modlog._init()
+ loop.run_until_complete(modlog._init(red))
# noinspection PyProtectedMember
bank._init()
- loop = asyncio.get_event_loop()
+
if os.name == "posix":
loop.add_signal_handler(SIGTERM, lambda: asyncio.ensure_future(sigterm_handler(red, log)))
tmp_data = {}
@@ -143,11 +160,11 @@ def main():
loop.run_until_complete(red.start(token, bot=True))
except discord.LoginFailure:
log.critical("This token doesn't seem to be valid.")
- db_token = loop.run_until_complete(red.db.token())
+ db_token = loop.run_until_complete(red._config.token())
if db_token and not cli_flags.no_prompt:
print("\nDo you want to reset the token? (y/n)")
if confirm("> "):
- loop.run_until_complete(red.db.token.set(""))
+ loop.run_until_complete(red._config.token.set(""))
print("Token has been reset.")
except KeyboardInterrupt:
log.info("Keyboard interrupt detected. Quitting...")
diff --git a/redbot/cogs/admin/admin.py b/redbot/cogs/admin/admin.py
index 4bbc28557..5fb7c044c 100644
--- a/redbot/cogs/admin/admin.py
+++ b/redbot/cogs/admin/admin.py
@@ -19,20 +19,34 @@ GENERIC_FORBIDDEN = _(
" Your command failed to successfully complete."
)
-HIERARCHY_ISSUE = _(
- "I tried to {verb} {role.name} to {member.display_name} but that role"
+HIERARCHY_ISSUE_ADD = _(
+ "I tried to add {role.name} to {member.display_name} but that role"
" is higher than my highest role in the Discord hierarchy so I was"
" unable to successfully add it. Please give me a higher role and "
"try again."
)
-USER_HIERARCHY_ISSUE = _(
- "I tried to {verb} {role.name} to {member.display_name} but that role"
+HIERARCHY_ISSUE_REMOVE = _(
+ "I tried to remove {role.name} from {member.display_name} but that role"
+ " is higher than my highest role in the Discord hierarchy so I was"
+ " unable to successfully remove it. Please give me a higher role and "
+ "try again."
+)
+
+USER_HIERARCHY_ISSUE_ADD = _(
+ "I tried to add {role.name} to {member.display_name} but that role"
" is higher than your highest role in the Discord hierarchy so I was"
" unable to successfully add it. Please get a higher role and "
"try again."
)
+USER_HIERARCHY_ISSUE_REMOVE = _(
+ "I tried to remove {role.name} from {member.display_name} but that role"
+ " is higher than your highest role in the Discord hierarchy so I was"
+ " unable to successfully remove it. Please get a higher role and "
+ "try again."
+)
+
ROLE_USER_HIERARCHY_ISSUE = _(
"I tried to edit {role.name} but that role"
" is higher than your highest role in the Discord hierarchy so I was"
@@ -111,9 +125,7 @@ class Admin(commands.Cog):
await member.add_roles(role)
except discord.Forbidden:
if not self.pass_hierarchy_check(ctx, role):
- await self.complain(
- ctx, T_(HIERARCHY_ISSUE), role=role, member=member, verb=_("add")
- )
+ await self.complain(ctx, T_(HIERARCHY_ISSUE_ADD), role=role, member=member)
else:
await self.complain(ctx, T_(GENERIC_FORBIDDEN))
else:
@@ -128,9 +140,7 @@ class Admin(commands.Cog):
await member.remove_roles(role)
except discord.Forbidden:
if not self.pass_hierarchy_check(ctx, role):
- await self.complain(
- ctx, T_(HIERARCHY_ISSUE), role=role, member=member, verb=_("remove")
- )
+ await self.complain(ctx, T_(HIERARCHY_ISSUE_REMOVE), role=role, member=member)
else:
await self.complain(ctx, T_(GENERIC_FORBIDDEN))
else:
@@ -156,9 +166,7 @@ class Admin(commands.Cog):
# noinspection PyTypeChecker
await self._addrole(ctx, user, rolename)
else:
- await self.complain(
- ctx, T_(USER_HIERARCHY_ISSUE), member=user, role=rolename, verb=_("add")
- )
+ await self.complain(ctx, T_(USER_HIERARCHY_ISSUE_ADD), member=user, role=rolename)
@commands.command()
@commands.guild_only()
@@ -176,9 +184,7 @@ class Admin(commands.Cog):
# noinspection PyTypeChecker
await self._removerole(ctx, user, rolename)
else:
- await self.complain(
- ctx, T_(USER_HIERARCHY_ISSUE), member=user, role=rolename, verb=_("remove")
- )
+ await self.complain(ctx, T_(USER_HIERARCHY_ISSUE_REMOVE), member=user, role=rolename)
@commands.group()
@commands.guild_only()
@@ -315,7 +321,7 @@ class Admin(commands.Cog):
valid_role_ids = set(r.id for r in valid_roles)
if selfrole_ids != valid_role_ids:
- await self.conf.guild(guild).selfroles.set(valid_role_ids)
+ await self.conf.guild(guild).selfroles.set(list(valid_role_ids))
# noinspection PyTypeChecker
return valid_roles
diff --git a/redbot/cogs/admin/locales/ar-SA.po b/redbot/cogs/admin/locales/ar-SA.po
index b6ad903c0..5d00c2df2 100644
--- a/redbot/cogs/admin/locales/ar-SA.po
+++ b/redbot/cogs/admin/locales/ar-SA.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,192 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "حاولت القيام بشيء لا أملك تصريح من ديسكورد لفعله. فشل أمرك في إكمال نجاحه."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "حاولت إضافة {role.name} إلى {member.display_name} ولكن هذه الرتبة هي أعلى من رتبتي في قائمة الرتب في السيرفر, لذلك فشل الأمر. حاول رفع رتبتي والمحاولة مجدداً."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr "لقد حاولت إضافة {role.name} إلى {member.display_name} ولكن هذه الرتبة هي أعلى من رتبتك في قائمة الرتب في السيرفر, لذلك فشل الأمر. حاول رفع رتبتي والمحاولة مجدداً."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr "أنا بالفعل أُعلن شيئاً. إذا كنت ترغب في إصدار إعلان مختلف الرجاء إستخدام `{prefix}announce cancel` أولاً."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr "مجموعة من أدوات إدارة السيرفر."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "لقد قمت بنجاح بإضافة {role.name} إلى {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "لقد قمت بنجاح بإزالة {role.name} من {member.display_name}"
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr " إذا تم ترك المستخدم فارغ, فسيكون إفتراضياً صاحب الأمر.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr " إذا تم ترك المستخدم فارغ, فسيكون إفتراضياً صاحب الأمر.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr "تعديل إعدادات الرتبة."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr " استخدم علامة اقتباس مزدوجة إذا كانت الرتبة تحتوي على مسافات.\n"
-" يجب أن يكون اللون بتنسيق سداسي عشري.\n"
-" موقع لإختيار الألوان (http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" أمثلة:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000` \n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "تم."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "تعديل إسم الرتبة.\n\n"
-" استخدم علامة اقتباس مزدوجة إذا كانت الرتبة تحتوي على مسافات.\n\n"
-" أمثلة:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:235
+#: redbot/cogs/admin/admin.py:250
#, docstring
msgid "Announce a message to all servers the bot is in."
msgstr "الإعلان عن رسالة إلى جميع السيرفرات المتواجد بها البوت."
-#: redbot/cogs/admin/admin.py:242
+#: redbot/cogs/admin/admin.py:257
msgid "The announcement has begun."
msgstr "تم البدء في الإعلان."
-#: redbot/cogs/admin/admin.py:250
+#: redbot/cogs/admin/admin.py:265
#, docstring
msgid "Cancel a running announce."
msgstr "إلغاء إعلان جارٍ."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr "تم إلغاء الإعلان الحالي."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr "تعديل القناة التي يستخدمها البوت للإعلانات."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr "تم تحديث قناة الإعلانات إلى {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr "تم تمكين الإعلانات في السيرفر."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr "سيرفر {guild.name} سيتلقى إعلانات الآن."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr "سيرفر {guild.name} لن يتلقى إعلانات."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "إضافة رتبة لنفسك.\n\n"
-" يجب على أدمن السيرفر أولاً إضافة الرتبة.\n\n"
-" ملاحظة: الرتبة حساسة لحالة الأحرف!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "إزالة رتبة ذاتية من نفسك.\n\n"
-" ملاحظة: الرتبة حساسة لحالة الأحرف!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "إضافة رتبة إلى قائمة الرتب الذاتية.\n\n"
-" ملاحظة: الرتبة حساسة لحالة الأحرف!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr "تم تحديث/تعديل قائمة الرتب الذاتية بنجاح."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "إزالة الرتبة من قائمة الرتب الذاتية.\n\n"
-" ملاحظة: الرتبة حساسة لحالة الأحرف!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-"قائمة بجميع الرتب الذاتية. "
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
-msgstr "الرتب الذاتية المتوفرة:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr "قفل البوت للسيرفر الحالي فقط."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr "لم يعد البوت مقفول للسيرفر الحالي فقط."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr "لقد تم قفل البوت للسيرفر الحالي فقط."
diff --git a/redbot/cogs/admin/locales/bg-BG.po b/redbot/cogs/admin/locales/bg-BG.po
index 90928144f..acd706665 100644
--- a/redbot/cogs/admin/locales/bg-BG.po
+++ b/redbot/cogs/admin/locales/bg-BG.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Bulgarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Завършено."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/cs-CZ.po b/redbot/cogs/admin/locales/cs-CZ.po
new file mode 100644
index 000000000..c44c33354
--- /dev/null
+++ b/redbot/cogs/admin/locales/cs-CZ.po
@@ -0,0 +1,186 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: cs\n"
+"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
+"Language: cs_CZ\n"
+
+#: redbot/cogs/admin/admin.py:17
+msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
+msgstr "Pokusil jsem se udělat něco, co mi Discord odepřel. Tvůj příkaz se nepodažilo úspěšně dokončit."
+
+#: redbot/cogs/admin/admin.py:22
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:29
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr "Už něco oznamuji. Pokud bys rád provedl jiné oznámení, nejdříve použij `{prefix}announce cancel`."
+
+#: redbot/cogs/admin/admin.py:53
+#, docstring
+msgid "A collection of server administration utilities."
+msgstr "Kolekce nástrojů pro správu serveru."
+
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
+msgid "I successfully added {role.name} to {member.display_name}"
+msgstr "Úspěšně jsem přidal {role.name} k {member.display_name}"
+
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:138
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr "Úspěšně jsem odstranil {role.name} od {member.display_name}"
+
+#: redbot/cogs/admin/admin.py:149
+#, docstring
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
+#, docstring
+msgid "Edit role settings."
+msgstr "Upraví nastavení role."
+
+#: redbot/cogs/admin/admin.py:194
+#, docstring
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
+msgid "Done."
+msgstr "Hotovo."
+
+#: redbot/cogs/admin/admin.py:222
+#, docstring
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:250
+#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
+msgid "Cancel a running announce."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:271
+msgid "The current announcement has been cancelled."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:277
+#, docstring
+msgid "Change the channel to which the bot makes announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:283
+msgid "The announcement channel has been set to {channel.mention}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:290
+#, docstring
+msgid "Toggle announcements being enabled this server."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:296
+msgid "The server {guild.name} will receive announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:300
+msgid "The server {guild.name} will not receive announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:326
+#, docstring
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:337
+#, docstring
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:347
+#, docstring
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
+msgid "The selfroles list has been successfully modified."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:360
+#, docstring
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:371
+#, docstring
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:394
+#, docstring
+msgid "Lock a bot to its current servers only."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:399
+msgid "The bot is no longer serverlocked."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:401
+msgid "The bot is now serverlocked."
+msgstr ""
+
+#: redbot/cogs/admin/announcer.py:70
+msgid "I could not announce to server: {server.id}"
+msgstr ""
+
+#: redbot/cogs/admin/converters.py:25
+msgid "The Admin cog is not loaded."
+msgstr ""
+
+#: redbot/cogs/admin/converters.py:34
+msgid "The provided role is not a valid selfrole."
+msgstr ""
+
diff --git a/redbot/cogs/admin/locales/da-DK.po b/redbot/cogs/admin/locales/da-DK.po
index b69bcc917..55068b9f3 100644
--- a/redbot/cogs/admin/locales/da-DK.po
+++ b/redbot/cogs/admin/locales/da-DK.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Danish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr ""
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/de-DE.po b/redbot/cogs/admin/locales/de-DE.po
index f07f5d486..486659d2d 100644
--- a/redbot/cogs/admin/locales/de-DE.po
+++ b/redbot/cogs/admin/locales/de-DE.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,194 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "Ich habe versucht etwas zu tun, für das mir Discord die Befugnis verweigerte. Dein Befehl konnte nicht erfolgreich ausgeführt werden."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "Ich versuchte die Rolle {role.name} an {member.display_name} zu geben, aber die Rolle ist höher als meine höchste Rolle in der Discord Hierarchie, daher war es mir nicht möglich sie hinzuzufügen. Bitte gib mir eine höhere Rolle und versuche es erneut."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr "Ich habe versucht {member.display_name} er Rolle: {role.name} {verb}, aber diese Rolle hat höhere Rechte als ich. Also war es nicht möglich die Rolle erfolgreich hinzuzufügen. Bitte geb mir eine höhere Rolle und versuche es erneut."
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr "Ich versuchte die Rolle {role.name} an {member.display_name} zu geben, aber die Rolle ist höher als deine höchste Rolle in der Discord Hierarchie, daher war es mir nicht möglich sie hinzuzufügen. Bitte gib dir selbst eine höhere Rolle und versuche es erneut."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Ich habe versucht die Rolle {role.name} an {member.display_name} zu {verb}, aber die Rolle ist höher als meine Rolle in der Discord Hierarchie, daher war es mir nicht möglich sie hinzuzufügen. Bitte gib mir eine höhere Rolle und versuche es erneut."
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Ich habe versucht {role.name} zu bearbeiten, aber die Rolle ist höher als deine höhste Rolle im Discord. Also konnte ich dies nicht erfolgreich hinzufügen. Versuche es mit einer höheren Rolle erneut."
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr "Ich kündige bereits etwas an. Wenn du eine andere Ankündigung machen willst, benutze bitte zuerst `{prefix}announce cancel`."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr "Eine Sammlung von administrativen Server-Verwaltungsprogramme."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "hinzuzufügen"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "Ich habe erfolgreich {role.name} zu {member.display_name} hinzugefügt"
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "entfernen"
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "Ich habe erfolgreich {role.name} von {member.display_name} entfernt"
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Gebe einem Benutzer ein Rolle.\n\n"
-" Wenn kein Benutzer angegeben wird, wird standardmäßig der Autor des Befehls gewählt.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Entferne eine Rolle von einem Benutzer.\n\n"
-" Wenn kein Benutzer angegeben wird, wird standardmäßig der Autor des Befehls gewählt.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr "Bearbeiten der Rollen Einstellungen."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr "Bearbeite die Farbe einer Rolle.\n\n"
-" Benutze Anführungszeichen wenn die Rolle ein Leerzeichen enthält.\n"
-" Die Farbe muss im Hexadezimal Format angegeben werden.\n"
-" [Online Farbwähler]()\n\n"
-" Beispiele:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Erledigt."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "Bearbeite den Namen einer Rolle.\n\n"
-" Benutze Anführungszeichen wenn die Rolle Leerzeichen enthält.\n\n"
-" Beispiele:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:235
+#: redbot/cogs/admin/admin.py:250
#, docstring
msgid "Announce a message to all servers the bot is in."
msgstr "Mache eine Ankündigung auf allen Servern auf denen der Bot ist."
-#: redbot/cogs/admin/admin.py:242
+#: redbot/cogs/admin/admin.py:257
msgid "The announcement has begun."
msgstr "Die Ankündigung hat begonnen."
-#: redbot/cogs/admin/admin.py:250
+#: redbot/cogs/admin/admin.py:265
#, docstring
msgid "Cancel a running announce."
msgstr "Breche eine laufende Ankündigung ab."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr "Die aktuelle Ankündigung wurde abgebrochen."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr "Ändere den Kanal in dem der Bot Ankündigungen macht."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr "Der für Ankündigungen gewählte Kanal wurde festgelegt auf {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr "Schaltet Ankündigungen auf diesem Server ein oder aus."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr "Der Server {guild.name} wird Ankündigunen erhalten."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr "Der Server {guild.name} wird keine Ankündigunen erhalten."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Gib dir selbst eine Rolle.\n\n"
-" Server Admins müssen die Rolle für Nutzer freigeben.\n\n"
-" HINWEIS: Die Rolle beachtet Groß- und Kleinschreibung!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Entferne eine auswählbare Rolle von dir selbst.\n\n"
-" HINWEIS: Die Rolle beachtet Groß- und Kleinschreibung!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Füge eine Rolle zur Liste der selbst auswählbaren Rollen hinzu.\n\n"
-" HINWEIS: Die Rolle beachtet Groß- und Kleinschreibung!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr "Die Liste selbst auswählbarer Rollen wurde erfolgreich bearbeitet."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Entferne eine selbst auswählbare Rolle von der Liste für verfügbare Rollen.\n\n"
-" HINWEIS: Die Rolle beachtet Groß- und Kleinschreibung!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-"Gibt eine Liste verfügbarer selbst auswählbarer Rollen aus. "
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
-msgstr "Verfügbare selbst auswählbare Rollen: {selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr "Sperrt den Bot neuen Servern beizutreten."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr "Der Bot ist nicht länger gesperrt neuen Servern beizutreten."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr "Der Bot ist jetzt gesperrt neuen Servern beizutreten."
diff --git a/redbot/cogs/admin/locales/el-GR.po b/redbot/cogs/admin/locales/el-GR.po
index 3766e63f0..1a913ff37 100644
--- a/redbot/cogs/admin/locales/el-GR.po
+++ b/redbot/cogs/admin/locales/el-GR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr ""
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/en-PT.po b/redbot/cogs/admin/locales/en-PT.po
index 689ac1119..658118504 100644
--- a/redbot/cogs/admin/locales/en-PT.po
+++ b/redbot/cogs/admin/locales/en-PT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Pirate English\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Done."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/es-ES.po b/redbot/cogs/admin/locales/es-ES.po
index 5d169b6bb..d4c097747 100644
--- a/redbot/cogs/admin/locales/es-ES.po
+++ b/redbot/cogs/admin/locales/es-ES.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,192 +21,166 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "Intenté hacer algo que Discord me ha negado el permiso. Su comando no se pudo completar."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "He intentado agregar {role.name} a {member.display_name} pero ese rol es más alto que mi rol en la jerarquía de Discord, por lo que no he podido añadirlo con éxito. Por favor dame un rol más alto y vuelva a intentarlo."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr "He intentado agregar {verb} {role.name} a {member.display_name} pero ese rol es más alto que mi rol en la jerarquía de Discord, por lo que no he podido añadirlo con éxito. Por favor dame un rol más alto y vuelva a intentarlo."
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "He intentado agregar {verb} {role.name} a {member.display_name} pero ese rol es más alto que mi rol en la jerarquía de Discord, por lo que no he podido añadirlo con éxito. Por favor dame un rol más alto y vuelva a intentarlo."
#: redbot/cogs/admin/admin.py:36
-msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
-msgstr ""
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "He intentado agregar {role.name} a pero ese rol es más alto que mi rol en la jerarquía de Discord, por lo que no he podido añadirlo con éxito. Por favor dame un rol más alto y vuelva a intentarlo."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr "Ya estoy anunciando algo. Si quieres hacer un anuncio diferente, por favor usa `{prefix}announce cancel` primero."
+
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
-msgstr ""
+msgstr "Una colección de utilidades de administración de servidores."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "añadir"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "He añadido con éxito {role.name} a {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "eliminar"
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "He retirado con éxito {role.name} de {member.display_name}"
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr ""
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr "Añadir un rol a un usuario.\\n\\n Si el usuario se deja en blanco, por defecto se convierte en autor del comando.\\n "
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr ""
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr "Eliminar un rol de un usuario.\\n\\n Si el usuario se deja en blanco, por defecto se convierte en autor del comando.\\n "
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr "Editar configuración de rol."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr "Editar el color de un rol.\n\n"
-" Usa comillas dobles si el rol contiene espacios.\n"
-" El color debe estar en formato hexadecimal.\n"
-" [Selector de color En-Linea](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"El Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Listo."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "Editar el nombre de un rol.\n\n"
-" Usa dobles comillas si el rol o el nombre contiene espacios.\n\n"
-" Ejemplos:\n"
-" `[p]editrole name \"El Transistor\" Test`\n"
-" "
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr "Anunciar un mensaje a todos los servidores en que el bot está."
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr "Anunciar un mensaje a todos los servidores en que el bot está."
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
-msgstr ""
+msgstr "El bot está bloqueado por el servidor."
#: redbot/cogs/admin/announcer.py:70
msgid "I could not announce to server: {server.id}"
-msgstr ""
+msgstr "No pude anunciar en servidor: {server.id}"
#: redbot/cogs/admin/converters.py:25
msgid "The Admin cog is not loaded."
-msgstr ""
+msgstr "El cog Admin no está cargado."
#: redbot/cogs/admin/converters.py:34
msgid "The provided role is not a valid selfrole."
-msgstr ""
+msgstr "El rol proporcionado no es un selfrole válido."
diff --git a/redbot/cogs/admin/locales/fi-FI.po b/redbot/cogs/admin/locales/fi-FI.po
index d6eddf479..179bdf45b 100644
--- a/redbot/cogs/admin/locales/fi-FI.po
+++ b/redbot/cogs/admin/locales/fi-FI.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Finnish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -18,172 +18,157 @@ msgstr ""
#: redbot/cogs/admin/admin.py:17
msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
-msgstr ""
+msgstr "Yritin tehdä jotain, jonka Discord kielsi minulle luvat. Komento epäonnistui onnistuneesti."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr "Yritin {verb} {role.name} kohtaan {member.display_name}, mutta tämä rooli on suurempi kuin korkein roolini Discord-hierarkiassa, joten en voinut lisätä sitä onnistuneesti. Anna minulle suurempi rooli ja yritä uudelleen."
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Yritin {verb} {role.name} kohtaan {member.display_name}, mutta tämä rooli on korkeampi kuin korkein rooli Discord-hierarkiassa, joten en voinut lisätä sitä onnistuneesti. Hanki suurempi rooli ja yritä uudelleen."
#: redbot/cogs/admin/admin.py:36
-msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
-msgstr ""
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Yritin muokata {role.name}, mutta tämä rooli on korkeampi kuin korkein rooli Discord-hierarkiassa, joten en voinut lisätä sitä onnistuneesti. Hanki suurempi rooli ja yritä uudelleen."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr "Olen jo ilmoittanut jotain. Jos haluat tehdä toisen ilmoituksen, käytä ensin \"{prefix} announce cancel\"."
+
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
-msgstr ""
+msgstr "Kokoelma palvelinhallintaohjelmia."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "lisätä"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
-msgstr ""
+msgstr "Lisäsin {role.name} onnistuneesti {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
-msgstr ""
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "poistaa"
#: redbot/cogs/admin/admin.py:138
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr "Olen poistanut {role.name} onnistuneesti {member.display_name}"
+
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
-msgstr ""
+msgstr "Muokkaa rooliasetuksia."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Tehty."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr "Ilmoita viesti kaikille palvelimille, joihin botti on."
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/fr-FR.po b/redbot/cogs/admin/locales/fr-FR.po
index 987f1b687..c65638e2e 100644
--- a/redbot/cogs/admin/locales/fr-FR.po
+++ b/redbot/cogs/admin/locales/fr-FR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:11\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,197 +21,156 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "J'ai tenté de faire quelque chose que pour lequel Discord m'a refusé les permissions. La commande a échoué."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "J'ai tenté d'ajouter le rôle {role.name} à {member.display_name} mais ce rôle est plus élevé que le mien dans la hiérarchie des rôles de ce serveur. Je n'ai donc pas pu l'ajouter. Tu peux réessayer en me donnant un rôle plus élevé."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr "J'ai essayé de {verb} {role.name} à {member.display_name} mais ce rôle est plus élevé que mon rôle le plus élevé dans la hiérarchie Discord, je n'ai donc pas réussi à l'ajouter. Donnez-moi un rôle plus élevé et réessayez."
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr "J'ai tenté d'ajouter le rôle {role.name} à {member.display_name} mais ce rôle est plus élevé que le tien dans la hiérarchie des rôles de ce serveur. Je n'ai donc pas pu l'ajouter. Tu peux réessayer mais il faudra d'abord que tu obtiennes un rôle plus élevé."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "J'ai essayé de {verb} {role.name} à {member.display_name} mais ce rôle est plus élevé que votre rôle le plus élevé dans la hiérarchie Discord donc je n'ai pas réussi à l'ajouter. Essayez à nouveau avec un rôle plus élevé."
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "J'ai essayé d'éditer {role.name} mais ce rôle est plus élevé que votre rôle le plus élevé dans la hiérarchie Discord et je n'ai donc pas réussi à l'ajouter. Essayez à nouveau avec un rôle plus élevé."
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr "Je suis déjà en train d'annoncer quelque chose. Si tu souhaites faire une annonce différente, tu dois d'abord utiliser la commande `{prefix}announce cancel`."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr "Un ensemble d'utilitaires d'administration du serveur."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "ajouter"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "J'ai bien ajouté le rôle {role.name} à {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "supprimer"
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "J'ai bien retiré le rôle {role.name} de {member.display_name}"
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Ajouter un rôle à un utilisateur.\n\n"
-" Si aucun utilisateur n'est mentionné dans la commande, celle-ci fera effet sur l'auteur.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr "Ajouter un rôle à un utilisateur.\\n\\n Si aucun utilisateur n'est mentionné dans la commande, celui-ci fera effet sur l'auteur.\\n "
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Retirer un rôle à un utilisateur.\n\n"
-" Si aucun utilisateur n'est mentionné dans la commande, celle-ci fera effet sur l'auteur.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr "Retirer un rôle à un utilisateur.\\n\\n Si aucun utilisateur n'est mentionné dans la commande, celui-ci fera effet sur l'auteur.\\n "
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr "Modifier les paramètres d'un rôle."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr "Modifier la couleur d'un rôle.\n\n"
-" Utilise des guillemets si le nom du rôle contient des espaces.\n"
-" La couleur doit être au format hexadécimal\n"
-" [Sélecteur de couleur en ligne](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Exemples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr "Modifier la couleur d'un rôle.\\n\\n Utilise des guillemets si le nom du rôle contient des espaces.\\n La couleur doit être au format hexadécimal\\n [Sélecteur de couleur en ligne](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Exemples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Fait."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "Modifier le nom d'un rôle.\n\n"
-" Utilise des guillemets si le nom du rôle contient des espaces.\n\n"
-" Exemples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr "Modifier le nom d'un rôle.\\n\\n Utilise des guillemets si le nom du rôle contient des espaces.\\n\\n Exemples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
-#: redbot/cogs/admin/admin.py:235
+#: redbot/cogs/admin/admin.py:250
#, docstring
msgid "Announce a message to all servers the bot is in."
msgstr "Faire une annonce à tous les serveurs dans lesquels le bot se trouve."
-#: redbot/cogs/admin/admin.py:242
+#: redbot/cogs/admin/admin.py:257
msgid "The announcement has begun."
msgstr "L’annonce a commencé."
-#: redbot/cogs/admin/admin.py:250
+#: redbot/cogs/admin/admin.py:265
#, docstring
msgid "Cancel a running announce."
msgstr "Interrompre une annonce en cours."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr "L'annonce actuelle a été interrompue."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr "Changer le salon dans lequel le bot fait des annonces."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr "Les annonces seront maintenant faites dans {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr "Activer ou désactiver les annonces sur ce serveur."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr "Le serveur {guild.name} recevra maintenant les annonces."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr "Le serveur {guild.name} ne recevra plus les annonces."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "S'ajouter un rôle à soi-même.\n\n"
-" Les administrateurs du serveur doivent avoir configuré le rôle en tant qu'ajoutable par les utilisateurs.\n\n"
-" NOTE: Le nom du rôle est sensible à la casse!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr "S'ajouter un rôle à soi-même.\\n\\n Les administrateurs du serveur doivent avoir configuré le rôle en tant qu'ajoutable par les utilisateurs.\\n\\n NOTE : Le nom du rôle est sensible aux majuscules et minuscules !\\n "
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Se supprimer un auto-rôle.\n\n"
-" NOTE: Le rôle est sensible à la casse! "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr "Se supprimer un auto-rôle.\\n\\n NOTE : Le rôle est sensible aux majuscules et minuscules !\\n "
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Ajouter un rôle à la liste des auto-rôles disponibles.\n\n"
-" NOTE : le nom du rôle est sensible à la casse !\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr "Ajouter un rôle à la liste des auto-rôles disponibles.\\n\\n NOTE : Le nom du rôle est sensible aux majuscules et minuscules !\\n "
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr "La liste des auto-rôles a été modifiée avec succès."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Supprimer un rôle de la liste des auto-rôles.\n\n"
-" NOTE : Le nom du rôle est sensible à la casse !\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr "Supprimer un rôle de la liste des auto-rôles.\\n\\n NOTE : Le nom du rôle est sensible aux majuscules et minuscules !\\n "
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-" Liste de tous les auto-rôles disponibles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
+msgstr "\\n Liste de tous les auto-rôles disponibles.\\n "
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
-msgstr "Auto-rôles disponibles :\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr "Auto-rôles disponibles :\\n{selfroles}"
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
-msgstr "Verrouiller le bot sur les serveurs où il est actuellement présent."
+msgstr "Verrouiller un bot sur ses serveurs actuels uniquement."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
-msgstr "Le bot n'est plus verrouillé sur ses serveurs."
+msgstr "Le bot n'est plus verrouillé sur ses serveurs actuels."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
-msgstr "Le bot est maintenant verrouillé sur ses serveurs."
+msgstr "Le bot est maintenant verrouillé sur ses serveurs actuels."
#: redbot/cogs/admin/announcer.py:70
msgid "I could not announce to server: {server.id}"
@@ -219,7 +178,7 @@ msgstr "Je n'ai pas pu faire d'annonce dans le serveur: {server.id}"
#: redbot/cogs/admin/converters.py:25
msgid "The Admin cog is not loaded."
-msgstr "Le module Admin n'est pas chargé."
+msgstr "Le cog Admin n'est pas chargé."
#: redbot/cogs/admin/converters.py:34
msgid "The provided role is not a valid selfrole."
diff --git a/redbot/cogs/admin/locales/hu-HU.po b/redbot/cogs/admin/locales/hu-HU.po
index 2548a582a..a80949e88 100644
--- a/redbot/cogs/admin/locales/hu-HU.po
+++ b/redbot/cogs/admin/locales/hu-HU.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Hungarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Kész."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/id-ID.po b/redbot/cogs/admin/locales/id-ID.po
index f4473c358..f5b2d5cf6 100644
--- a/redbot/cogs/admin/locales/id-ID.po
+++ b/redbot/cogs/admin/locales/id-ID.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Indonesian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "menambahkan"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "menghapus"
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Selesai."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/it-IT.po b/redbot/cogs/admin/locales/it-IT.po
index 97d740500..0545fe696 100644
--- a/redbot/cogs/admin/locales/it-IT.po
+++ b/redbot/cogs/admin/locales/it-IT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -18,184 +18,169 @@ msgstr ""
#: redbot/cogs/admin/admin.py:17
msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
-msgstr ""
+msgstr "Ho cercato di fare qualcosa ma Discord mi ha negato i permessi per farla. Il tuo comando non è stato completato con successo."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr "Ho cercato di {verb} {role.name} al gruppo {member.display_name} ma quel ruolo è più elevato del mio livello nella gerarchia di Discord quindi non sono stato in grado di aggiungerlo. prova a darmi un ruolo più alto e riprova."
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Ho cercato di {verb} {role.name} al gruppo {member.display_name} ma quel ruolo è più elevato del tuo livello nella gerarchia di Discord quindi non sono stato in grado di aggiungerlo. Raggiungi un ruolo più alto e riprova."
#: redbot/cogs/admin/admin.py:36
-msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
-msgstr ""
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Ho cercato di modificare {role.name} ma quel ruolo è più elevato del tuo livello nella gerarchia di Discord quindi non sono stato in grado di aggiungerlo. Raggiungi un ruolo più alto e riprova."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr "Sto già annunciando qualcosa. Se desideri fare un annuncio diverso, usa prima `{prefix}announce cancel`."
+
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
-msgstr ""
+msgstr "Una collezione di servizi di amministrazione del server."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "aggiungere"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
-msgstr ""
+msgstr "Ho aggiunto con successo {role.name} al gruppo {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
-msgstr ""
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "rimuovere"
#: redbot/cogs/admin/admin.py:138
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr "Ho rimosso con successo {role.name} dal gruppo {member.display_name}"
+
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
-msgstr ""
+msgstr "Modifica impostazioni ruolo."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Fatto."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr "Invia un annuncio a tutti i server in cui si trova il bot."
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr "L'annuncio è partito."
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
-msgstr ""
+msgstr "Cancella un annuncio in corso."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
-msgstr ""
+msgstr "L'annuncio in corso è stato cancellato."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
-msgstr ""
+msgstr "Modifica il canale in cui il bot invia gli annunci."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
-msgstr ""
+msgstr "Il canale per gli annunci è stato impostato su {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
-msgstr ""
+msgstr "Attiva/disattiva gli annunci in questo server."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
-msgstr ""
+msgstr "Il server {guild.name} riceverà gli annunci."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
-msgstr ""
+msgstr "Il server {guild.name} non riceverà gli annunci."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
-msgstr ""
+msgstr "La lista dei ruoli autoassegnabili e stata modificata."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
-msgstr ""
+msgstr "Blocca un bot ai suoi server attuali."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
-msgstr ""
+msgstr "Il bot non è più bloccato ai server."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
-msgstr ""
+msgstr "Il bot è bloccato ai server."
#: redbot/cogs/admin/announcer.py:70
msgid "I could not announce to server: {server.id}"
-msgstr ""
+msgstr "Non ho potuto annunciare al server: {server.id}"
#: redbot/cogs/admin/converters.py:25
msgid "The Admin cog is not loaded."
-msgstr ""
+msgstr "Il cog Admin non è caricato."
#: redbot/cogs/admin/converters.py:34
msgid "The provided role is not a valid selfrole."
-msgstr ""
+msgstr "Il ruolo fornito non è un ruolo autoassegnabile valido."
diff --git a/redbot/cogs/admin/locales/ja-JP.po b/redbot/cogs/admin/locales/ja-JP.po
index fdc719b15..5a3b85266 100644
--- a/redbot/cogs/admin/locales/ja-JP.po
+++ b/redbot/cogs/admin/locales/ja-JP.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "私は不和が私に権限を拒否した何かをしようとしました。コマンドを正常に完了できませんでした。"
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "{member.display_name} に {role.name} を追加してみましたが、その役割は不和階層で私の最高の役割よりも高いので、それを正常に追加できませんでした。私に高い役割を与えるし、もう一度やり直してください。"
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr ""
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/ko-KR.po b/redbot/cogs/admin/locales/ko-KR.po
index 06b99fc92..1cead1779 100644
--- a/redbot/cogs/admin/locales/ko-KR.po
+++ b/redbot/cogs/admin/locales/ko-KR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Korean\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,170 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "다 했어요."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-"사용 가능한 역할들을 모두 나열할게요. "
-
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/lol-US.po b/redbot/cogs/admin/locales/lol-US.po
index d4f29058a..235559d1b 100644
--- a/redbot/cogs/admin/locales/lol-US.po
+++ b/redbot/cogs/admin/locales/lol-US.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: LOLCAT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "Discord sayed I can't do sometingz. Ur command faild 2 complete."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr ""
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/nl-NL.po b/redbot/cogs/admin/locales/nl-NL.po
index 377f7d0e1..1c00f9f86 100644
--- a/redbot/cogs/admin/locales/nl-NL.po
+++ b/redbot/cogs/admin/locales/nl-NL.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Dutch\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,189 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "Ik probeerde iets te doen, maar Discord weigerde mij toestemming te geven. Je command is geslaagd te mislukken."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "Ik probeerder {role.name} toe te voegen aan {member.display_name}, maar die rol is waarschijnlijk een hogere rol dan die van mij. Ik kan de rol daarom niet toevoegen. Geef mij een hogere rol en probeer het nog eens."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr "Ik probeerder {role.name} toe te voegen aan {member.display_name}, maar die rol is waarschijnlijk een hogere rol dan die van jou. Ik kan de rol daarom niet toevoegen. Krijg een hogere rol en probeer het nog eens."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr "Ik ben al iets aan het aankondigen. Als je iets anders wilt aankondigen, voer dan eerst deze command uit: '{prefix}announce cancel'."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr "Een collectie van de server administratie voorzieningen."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "Ik heb succesvol {role.name} toegevoegd aan {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "Ik heb succesvol {role.name} verwijderd van {member.display_name}"
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Een rol toevoegen aan een lid.\n\n"
-" Als je geen lid invult, dan is het automatisch de auteur van de command."
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Een rol verwijderen van een lid.\n\n"
-" Als je geen lid invult, dan is het automatisch de auteur van de command."
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr "Rol instellingen bewerken."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr "Een rolkleur bewerken.\n\n"
-" Gebruik dubbele aanhalingstekens als de rol een spatie bevat.\n"
-" Een kleur moet van heximaal formaat zijn.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Voorbeelden:\n"
-" `[p]editrole colour \"DP Bots\" #ff0000`\n"
-" `[p]editrole colour Teamlid #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Klaar."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "Een rolnamen bewerken.\n\n"
-" Gebruik dubbele aanhalingstekens als de rol een spatie bevat.\n\n"
-" Voorbeeld: \n"
-" `[p]editrole name \"DP Bots\" Bots`\n"
-" "
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:235
+#: redbot/cogs/admin/admin.py:250
#, docstring
msgid "Announce a message to all servers the bot is in."
msgstr "Kondig een bericht aan in alle servers."
-#: redbot/cogs/admin/admin.py:242
+#: redbot/cogs/admin/admin.py:257
msgid "The announcement has begun."
msgstr "De aankondiging is begonnen."
-#: redbot/cogs/admin/admin.py:250
+#: redbot/cogs/admin/admin.py:265
#, docstring
msgid "Cancel a running announce."
msgstr "Annuleer een huidige aankondiging."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr "De huidige aankondiging is geannuleerd."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr "Bewerk het kanaal waar de bot aankondigingen maakt."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr "Het aankondigingskanaal is aangepast naar {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr "Aankondigingen zijn geactiveerd in deze server."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr "De server {guild.name} ontvangt aankondigingen."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr "De server {guild.name} ontvangt geen aankondigingen."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Voeg een rol aan jezelf toe. \n\n"
-" Server teamleden moeten de rol als een user settable.\n\n"
-" LET OP: De rolnaam is hoofdlettergevoelig. "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Verwijder een rol van jezelf.\n\n"
-" LET OP: De rolnaam is hoofdlettergevoelig. "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Voeg een rol toe aan de lijst met beschikbare selfroles. \n\n"
-" OPMERKING: De rol is hoofdlettergevoelig!"
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr "De selfroles lijst is succesvol aangepast."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Verwijder een rol uit de lijst met beschikbare selfroles. \n\n"
-" OPMERKING: De rol is hoofdlettergevoelig!"
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-"Laat alle beschikbare selfroles zien."
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
-msgstr "Beschikbare Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr "Vergrendel de bot voor alleen deze server."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr "De bot is niet langer vergrendeld."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr "De bot is vergrendeld."
diff --git a/redbot/cogs/admin/locales/no-NO.po b/redbot/cogs/admin/locales/no-NO.po
index d7a9d82cb..90a09eb83 100644
--- a/redbot/cogs/admin/locales/no-NO.po
+++ b/redbot/cogs/admin/locales/no-NO.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Norwegian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Ferdig."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/pl-PL.po b/redbot/cogs/admin/locales/pl-PL.po
index 3a1bd5607..efb659fd6 100644
--- a/redbot/cogs/admin/locales/pl-PL.po
+++ b/redbot/cogs/admin/locales/pl-PL.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Polish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr "Spróbowałam {verb} {role.name} na {member.display_name}, ale ta rola jest wyższa niż moja najwyższa rola w hierarchii Discorda, więc nie mogłam jej dodać. Daj mi proszę wyższą rolę i spróbuj ponownie."
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr ""
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Spróbowałam {verb} {role.name} na {member.display_name}, ale ta rola jest wyższa niż twoja najwyższa rola w hierarchii Discorda, więc nie mogłam jej dodać. Uzyskaj proszę wyższą rolę i spróbuj ponownie."
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Spróbowałam zmienić {role.name}, ale ta rola jest wyższa niż twoja najwyższa rola w hierarchii Discorda, więc nie mogłam jej dodać. Uzyskaj proszę wyższą rolę i spróbuj ponownie."
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "dodać"
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "usunąć"
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Gotowe."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/pt-BR.po b/redbot/cogs/admin/locales/pt-BR.po
index a8977cc76..0a2abf594 100644
--- a/redbot/cogs/admin/locales/pt-BR.po
+++ b/redbot/cogs/admin/locales/pt-BR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Portuguese, Brazilian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -18,172 +18,157 @@ msgstr ""
#: redbot/cogs/admin/admin.py:17
msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
-msgstr ""
+msgstr "Eu tentei fazer algo que o Discord me negou as permissões. Seu comando falhou em ser completado com sucesso."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
-msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr "Eu já estou anunciando algo. Se quer fazer um anúncio diferente, por favor use `{prefix}announce cancel` primeiro."
+
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
+msgstr "Uma coleção de ferramentas de administração para o servidor."
+
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
-msgstr ""
+msgstr "Eu adicionei com sucesso {role.name} de {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr "Eu removi com sucesso {role.name} de {member.display_name}"
+
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
-msgstr ""
+msgstr "Edite as configurações de cargo."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Concluído."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/pt-PT.po b/redbot/cogs/admin/locales/pt-PT.po
index a64192382..da237dfb7 100644
--- a/redbot/cogs/admin/locales/pt-PT.po
+++ b/redbot/cogs/admin/locales/pt-PT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,196 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr "Tentei fazer uma coisa que o Discord negou permissão para fazer. O comando não foi concluído."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "Tentei adicionar {role.name} a {member.display_name} mas esse cargo é maior do que o meu maior cargo atual na hierarquia do Discord por isso não me é possível concluir a ação com sucesso. Dá-me um cargo maior e tenta novamente."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr "Tentei adicionar {role.name} a {member.display_name} mas esse cargo é maior do que o teu maior cargo atual na hierarquia do Discord por isso não me é possível concluir a ação com sucesso. Obtém um cargo maior e tenta novamente."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr "Já estou a anunciar algo. Se queres fazer um anúncio diferente usa `{prefix}announce cancel` antes de usares este comando."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr "Uma coleção de utilidades para administração de servidores."
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "Adicionei com sucesso {role.name} a {member.display_name}"
-#: redbot/cogs/admin/admin.py:127
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:138
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "Removi com sucesso {role.name} de {member.display_name}"
-#: redbot/cogs/admin/admin.py:138
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Adiciona um cargo a um utilizador.\n\n"
-" Se o utilizador for deixado em branco é utilizado por padrão o autor do comando.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:169
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Remove um cargo a um utilizador.\n\n"
-" Se o utilizador for deixado em branco é utilizado por padrão o autor do comando.\n"
-" "
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr "Edite a cor do cargo\n\n"
-" Use aspas se o cargo contiver espaços.\n"
-" A cor deve ser em formato hexadecimal.\n"
-" [Seleção de Cor Online](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Exemplos:\n"
-" `[p]editrole colour \"Team rS\" #ff0000`\n"
-" `[p]editrole colour Teste #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Concluído."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "Edite o nome do cargo.\n\n"
-" Use aspas se o cargo contiver espaços.\n\n"
-" Exemplos:\n"
-" `[p]editrole name \"Team rS\" Test`\n"
-" "
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:235
+#: redbot/cogs/admin/admin.py:250
#, docstring
msgid "Announce a message to all servers the bot is in."
msgstr "Anuncia uma mensagem para todos os servidores em que o bot está."
-#: redbot/cogs/admin/admin.py:242
+#: redbot/cogs/admin/admin.py:257
msgid "The announcement has begun."
msgstr "O anúncio foi iniciado."
-#: redbot/cogs/admin/admin.py:250
+#: redbot/cogs/admin/admin.py:265
#, docstring
msgid "Cancel a running announce."
msgstr "Cancelar um anúncio em curso."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr "O anúncio atual foi cancelado."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr "Mude o canal para o qual o bot faz os anúncios."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr "O canal de anúncio foi definido para {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr "Ativar ou Desativar os anúncios neste servidor."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr "O servidor {guild.name} vai receber anúncios."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr "O servidor {guild.name} não vai receber anúncios."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Adiciona um cargo a si próprio\n\n"
-" Os administradores do servidor têm de ter configurado o cargo como definível.\n\n"
-" NOTA: O cargo é sensível às maiúsculas e minúsculas!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Remove um cargo a si próprio.\n\n"
-" NOTA: O cargo é sensível às maiúsculas e minúsculas!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Adiciona um cargo à lista de cargos definíveis.\n\n"
-" NOTA: O cargo é sensível às maiúsculas e minúsculas!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr "A lista de cargos definíveis foi modificada com sucesso."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Remove um cargo da lista de cargos definíveis.\n\n"
-" NOTA: O cargo é sensível às maiúsculas e minúsculas!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-" Lista de todos os cargos definíveis disponíveis.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
-msgstr "Cargos definíveis disponíveis:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr "Bloquear o bot aos servidores atuais."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr "O bot já não está bloqueado aos servidores atuais."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr "O bot está agora bloqueado aos servidores atuais."
diff --git a/redbot/cogs/admin/locales/ro-RO.po b/redbot/cogs/admin/locales/ro-RO.po
new file mode 100644
index 000000000..1ae4f1874
--- /dev/null
+++ b/redbot/cogs/admin/locales/ro-RO.po
@@ -0,0 +1,186 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:09\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Romanian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: ro\n"
+"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
+"Language: ro_RO\n"
+
+#: redbot/cogs/admin/admin.py:17
+msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:22
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:29
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:53
+#, docstring
+msgid "A collection of server administration utilities."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
+msgid "I successfully added {role.name} to {member.display_name}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:138
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:149
+#, docstring
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
+#, docstring
+msgid "Edit role settings."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:194
+#, docstring
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
+msgid "Done."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:222
+#, docstring
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:250
+#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
+msgid "Cancel a running announce."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:271
+msgid "The current announcement has been cancelled."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:277
+#, docstring
+msgid "Change the channel to which the bot makes announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:283
+msgid "The announcement channel has been set to {channel.mention}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:290
+#, docstring
+msgid "Toggle announcements being enabled this server."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:296
+msgid "The server {guild.name} will receive announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:300
+msgid "The server {guild.name} will not receive announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:326
+#, docstring
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:337
+#, docstring
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:347
+#, docstring
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
+msgid "The selfroles list has been successfully modified."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:360
+#, docstring
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:371
+#, docstring
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:394
+#, docstring
+msgid "Lock a bot to its current servers only."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:399
+msgid "The bot is no longer serverlocked."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:401
+msgid "The bot is now serverlocked."
+msgstr ""
+
+#: redbot/cogs/admin/announcer.py:70
+msgid "I could not announce to server: {server.id}"
+msgstr ""
+
+#: redbot/cogs/admin/converters.py:25
+msgid "The Admin cog is not loaded."
+msgstr ""
+
+#: redbot/cogs/admin/converters.py:34
+msgid "The provided role is not a valid selfrole."
+msgstr ""
+
diff --git a/redbot/cogs/admin/locales/ru-RU.po b/redbot/cogs/admin/locales/ru-RU.po
index 2279158fc..15cf95b1e 100644
--- a/redbot/cogs/admin/locales/ru-RU.po
+++ b/redbot/cogs/admin/locales/ru-RU.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 05:52\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -18,201 +18,159 @@ msgstr ""
#: redbot/cogs/admin/admin.py:17
msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
-msgstr "Я попытался сделать что-то, для чего Discord отказал мне в разрешениях. Ваша команда не была успешно выполнена."
+msgstr "Я попыталась сделать что-то, в чем Discord отказал мне в разрешениях. Ваша команда не была выполнена успешно."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
-msgstr "Я попытался добавить {member.display_name} в {role.name}, но эта роль выше, чем моя наивысшая роль в иерархии Discord, поэтому я не смог добавить ее успешно. Пожалуйста, дайте мне более высокую роль и повторите попытку."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
-msgstr "Я попытался добавить {member.display_name} в {role.name}, но эта роль выше, чем ваша наивысшая роль в иерархии Discord, поэтому я не смог добавить ее успешно. Пожалуйста, получите более высокую роль и повторите попытку."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr "Я попытался изменить {role.name}, но эта роль выше Вашей в иерархии Discord, поэтому я не смог добавить её. Повысьте роль и попробуйте еще раз."
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr "Я уже что-то объявляю. Если вы хотите сделать другое объявление, сначала используйте `{prefix}announce cancel`."
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr "Набор утилит администрирования сервера."
-#: redbot/cogs/admin/admin.py:112
-msgid "I successfully added {role.name} to {member.display_name}"
-msgstr "Я успешно добавил {member.display_name} в {role.name}"
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr "добавить"
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
-msgstr "Я успешно убрал {member.display_name} из {role.name}"
+#: redbot/cogs/admin/admin.py:121
+msgid "I successfully added {role.name} to {member.display_name}"
+msgstr "Я успешно добавила роль {role.name} пользователю {member.display_name}"
+
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr "удалить"
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Добавляет роль пользователю.\n\n"
-" Если пользователь не указан, то по умолчанию используется отправитель.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr "Я успешно забрала роль {role.name} у пользователя {member.display_name}"
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
-msgstr "Забирает роль у пользователя.\n\n"
-" Если пользователь не указан, то по умолчанию используется отправитель.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr "Изменение параметров роли."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
-msgstr "Изменить цвет роли.\n\n"
-" Используйте двойные кавычки, если роль содержит пробелы.\n"
-" Цвет должен быть в шестнадцатеричном формате.\n"
-" [Онлайн-палитра цветов](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Примеры:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr "Готово."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr "Изменить имя роли.\n\n"
-" Используйте двойные кавычки, если роль или имя содержат пробелы.\n\n"
-" Примеры:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:235
+#: redbot/cogs/admin/admin.py:250
#, docstring
msgid "Announce a message to all servers the bot is in."
msgstr "Объявить сообщение на всех серверах, к которым подключен бот."
-#: redbot/cogs/admin/admin.py:242
+#: redbot/cogs/admin/admin.py:257
msgid "The announcement has begun."
msgstr "Объявление началось."
-#: redbot/cogs/admin/admin.py:250
+#: redbot/cogs/admin/admin.py:265
#, docstring
msgid "Cancel a running announce."
msgstr "Отменить текущее объявление."
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr "Текущее объявление было отменено."
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr "Изменить канал, на котором бот делает объявления."
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr "Канал объявления был установлен на {channel.mention}"
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr "Переключить объявления, когда этот сервер включен."
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr "Сервер {guild.name} будет получать объявления."
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr "Сервер {guild.name} не будет получать объявления."
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Добавить себе роль.\n\n"
-" Администраторы сервера должны настроить роль как настраиваемую пользователем.\n\n"
-" ПРИМЕЧАНИЕ: Роль чувствительна к регистру!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Удалить свою роль.\n\n"
-" ПРИМЕЧАНИЕ: Роль чувствительна к регистру!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Добавить роль в список доступных ролей.\n\n"
-" ПРИМЕЧАНИЕ: Роль чувствительна к регистру!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr "Список ролей был изменен успешно."
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
-msgstr "Удалить роль из списка доступных ролей.\n\n"
-" ПРИМЕЧАНИЕ: Роль чувствительна к регистру!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
-msgstr "\n"
-" Список всех доступных ролей.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
-msgstr "Доступные роли:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
-msgstr "Заблокировать бота только на его текущих серверах."
+msgstr "Зафиксировать бота только на его текущих серверах."
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
-msgstr "Бот больше не заблокирован на сервере."
+msgstr "Бот больше не зафиксирован на сервере."
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
-msgstr "Бот теперь заблокирован на сервере."
+msgstr "Бот теперь зафиксирован на сервере."
#: redbot/cogs/admin/announcer.py:70
msgid "I could not announce to server: {server.id}"
@@ -220,7 +178,7 @@ msgstr "Я не могу объявить на сервере: {server.id}"
#: redbot/cogs/admin/converters.py:25
msgid "The Admin cog is not loaded."
-msgstr "Плагин администрирования не загружен."
+msgstr "Модуль Admin не загружен."
#: redbot/cogs/admin/converters.py:34
msgid "The provided role is not a valid selfrole."
diff --git a/redbot/cogs/admin/locales/sk-SK.po b/redbot/cogs/admin/locales/sk-SK.po
index e9b5fb3de..9215bdfb3 100644
--- a/redbot/cogs/admin/locales/sk-SK.po
+++ b/redbot/cogs/admin/locales/sk-SK.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Slovak\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
msgstr ""
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/sv-SE.po b/redbot/cogs/admin/locales/sv-SE.po
index bfc147b27..a69ca4fec 100644
--- a/redbot/cogs/admin/locales/sv-SE.po
+++ b/redbot/cogs/admin/locales/sv-SE.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -18,172 +18,157 @@ msgstr ""
#: redbot/cogs/admin/admin.py:17
msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
-msgstr ""
+msgstr "Jag försökte göra något som Discord nekade mig behörighet till. Ditt kommando kunde inte slutföras."
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
+msgstr "En samling administrationsverktyg för servern."
+
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
-msgstr ""
+msgstr "Redigera rollinställningar."
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Klart."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/tr-TR.po b/redbot/cogs/admin/locales/tr-TR.po
index 17207f874..cabae0a83 100644
--- a/redbot/cogs/admin/locales/tr-TR.po
+++ b/redbot/cogs/admin/locales/tr-TR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Turkish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "Tamamdır."
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/zh-CN.po b/redbot/cogs/admin/locales/zh-CN.po
index 7b90bf027..1f847d08b 100644
--- a/redbot/cogs/admin/locales/zh-CN.po
+++ b/redbot/cogs/admin/locales/zh-CN.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Chinese Simplified\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -21,169 +21,154 @@ msgid "I attempted to do something that Discord denied me permissions for. Your
msgstr ""
#: redbot/cogs/admin/admin.py:22
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:29
-msgid "I tried to add {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
msgstr ""
#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
-#: redbot/cogs/admin/admin.py:46
+#: redbot/cogs/admin/admin.py:53
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
-#: redbot/cogs/admin/admin.py:112
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:127
-msgid "I successfully removed {role.name} from {member.display_name}"
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
msgstr ""
#: redbot/cogs/admin/admin.py:138
-#, docstring
-msgid "Add a role to a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "I successfully removed {role.name} from {member.display_name}"
msgstr ""
-#: redbot/cogs/admin/admin.py:156
+#: redbot/cogs/admin/admin.py:149
#, docstring
-msgid "Remove a role from a user.\n\n"
-" If user is left blank it defaults to the author of the command.\n"
-" "
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:172
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "Edit role settings."
msgstr ""
-#: redbot/cogs/admin/admin.py:179
+#: redbot/cogs/admin/admin.py:194
#, docstring
-msgid "Edit a role's colour.\n\n"
-" Use double quotes if the role contains spaces.\n"
-" Colour must be in hexadecimal format.\n"
-" [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\n\n"
-" Examples:\n"
-" `[p]editrole colour \"The Transistor\" #ff0000`\n"
-" `[p]editrole colour Test #ff9900`\n"
-" "
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:202 redbot/cogs/admin/admin.py:230
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
msgid "Done."
-msgstr ""
+msgstr "完成。"
-#: redbot/cogs/admin/admin.py:207
+#: redbot/cogs/admin/admin.py:222
#, docstring
-msgid "Edit a role's name.\n\n"
-" Use double quotes if the role or the name contain spaces.\n\n"
-" Examples:\n"
-" `[p]editrole name \"The Transistor\" Test`\n"
-" "
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:235
-#, docstring
-msgid "Announce a message to all servers the bot is in."
-msgstr ""
-
-#: redbot/cogs/admin/admin.py:242
-msgid "The announcement has begun."
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
#: redbot/cogs/admin/admin.py:250
#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
msgid "Cancel a running announce."
msgstr ""
-#: redbot/cogs/admin/admin.py:256
+#: redbot/cogs/admin/admin.py:271
msgid "The current announcement has been cancelled."
msgstr ""
-#: redbot/cogs/admin/admin.py:262
+#: redbot/cogs/admin/admin.py:277
#, docstring
msgid "Change the channel to which the bot makes announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:268
+#: redbot/cogs/admin/admin.py:283
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
-#: redbot/cogs/admin/admin.py:275
+#: redbot/cogs/admin/admin.py:290
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
-#: redbot/cogs/admin/admin.py:281
+#: redbot/cogs/admin/admin.py:296
msgid "The server {guild.name} will receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:285
+#: redbot/cogs/admin/admin.py:300
msgid "The server {guild.name} will not receive announcements."
msgstr ""
-#: redbot/cogs/admin/admin.py:311
+#: redbot/cogs/admin/admin.py:326
#, docstring
-msgid "Add a role to yourself.\n\n"
-" Server admins must have configured the role as user settable.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:322
+#: redbot/cogs/admin/admin.py:337
#, docstring
-msgid "Remove a selfrole from yourself.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:332
+#: redbot/cogs/admin/admin.py:347
#, docstring
-msgid "Add a role to the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:340 redbot/cogs/admin/admin.py:352
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
msgid "The selfroles list has been successfully modified."
msgstr ""
-#: redbot/cogs/admin/admin.py:345
+#: redbot/cogs/admin/admin.py:360
#, docstring
-msgid "Remove a role from the list of available selfroles.\n\n"
-" NOTE: The role is case sensitive!\n"
-" "
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:356
+#: redbot/cogs/admin/admin.py:371
#, docstring
-msgid "\n"
-" Lists all available selfroles.\n"
-" "
+msgid "\\n Lists all available selfroles.\\n "
msgstr ""
-#: redbot/cogs/admin/admin.py:362
-msgid "Available Selfroles:\n"
-"{selfroles}"
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
-#: redbot/cogs/admin/admin.py:379
+#: redbot/cogs/admin/admin.py:394
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
-#: redbot/cogs/admin/admin.py:384
+#: redbot/cogs/admin/admin.py:399
msgid "The bot is no longer serverlocked."
msgstr ""
-#: redbot/cogs/admin/admin.py:386
+#: redbot/cogs/admin/admin.py:401
msgid "The bot is now serverlocked."
msgstr ""
diff --git a/redbot/cogs/admin/locales/zh-TW.po b/redbot/cogs/admin/locales/zh-TW.po
new file mode 100644
index 000000000..cd2358821
--- /dev/null
+++ b/redbot/cogs/admin/locales/zh-TW.po
@@ -0,0 +1,186 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Chinese Traditional\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: zh-TW\n"
+"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
+"Language: zh_TW\n"
+
+#: redbot/cogs/admin/admin.py:17
+msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:22
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than my highest role in the Discord hierarchy so I was unable to successfully add it. Please give me a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:29
+msgid "I tried to {verb} {role.name} to {member.display_name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:36
+msgid "I tried to edit {role.name} but that role is higher than your highest role in the Discord hierarchy so I was unable to successfully add it. Please get a higher role and try again."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:43
+msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:53
+#, docstring
+msgid "A collection of server administration utilities."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:115 redbot/cogs/admin/admin.py:160
+msgid "add"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:121
+msgid "I successfully added {role.name} to {member.display_name}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:132 redbot/cogs/admin/admin.py:180
+msgid "remove"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:138
+msgid "I successfully removed {role.name} from {member.display_name}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:149
+#, docstring
+msgid "Add a role to a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:169
+#, docstring
+msgid "Remove a role from a user.\\n\\n If user is left blank it defaults to the author of the command.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:187
+#, docstring
+msgid "Edit role settings."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:194
+#, docstring
+msgid "Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:217 redbot/cogs/admin/admin.py:245
+msgid "Done."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:222
+#, docstring
+msgid "Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Examples:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:250
+#, docstring
+msgid "Announce a message to all servers the bot is in."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:257
+msgid "The announcement has begun."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:265
+#, docstring
+msgid "Cancel a running announce."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:271
+msgid "The current announcement has been cancelled."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:277
+#, docstring
+msgid "Change the channel to which the bot makes announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:283
+msgid "The announcement channel has been set to {channel.mention}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:290
+#, docstring
+msgid "Toggle announcements being enabled this server."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:296
+msgid "The server {guild.name} will receive announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:300
+msgid "The server {guild.name} will not receive announcements."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:326
+#, docstring
+msgid "Add a role to yourself.\\n\\n Server admins must have configured the role as user settable.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:337
+#, docstring
+msgid "Remove a selfrole from yourself.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:347
+#, docstring
+msgid "Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:355 redbot/cogs/admin/admin.py:367
+msgid "The selfroles list has been successfully modified."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:360
+#, docstring
+msgid "Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:371
+#, docstring
+msgid "\\n Lists all available selfroles.\\n "
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:377
+msgid "Available Selfroles:\\n{selfroles}"
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:394
+#, docstring
+msgid "Lock a bot to its current servers only."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:399
+msgid "The bot is no longer serverlocked."
+msgstr ""
+
+#: redbot/cogs/admin/admin.py:401
+msgid "The bot is now serverlocked."
+msgstr ""
+
+#: redbot/cogs/admin/announcer.py:70
+msgid "I could not announce to server: {server.id}"
+msgstr ""
+
+#: redbot/cogs/admin/converters.py:25
+msgid "The Admin cog is not loaded."
+msgstr ""
+
+#: redbot/cogs/admin/converters.py:34
+msgid "The provided role is not a valid selfrole."
+msgstr ""
+
diff --git a/redbot/cogs/alias/alias.py b/redbot/cogs/alias/alias.py
index 8a24a727c..d695c7bd0 100644
--- a/redbot/cogs/alias/alias.py
+++ b/redbot/cogs/alias/alias.py
@@ -89,8 +89,12 @@ class Alias(commands.Cog):
return False, None
def is_command(self, alias_name: str) -> bool:
+ """
+ The logic here is that if this returns true, the name shouldnt be used for an alias
+ The function name can be changed when alias is reworked
+ """
command = self.bot.get_command(alias_name)
- return command is not None
+ return command is not None or alias_name in commands.RESERVED_COMMAND_NAMES
@staticmethod
def is_valid_alias_name(alias_name: str) -> bool:
@@ -375,7 +379,7 @@ class Alias(commands.Cog):
await ctx.send(_("There is no alias with the name `{name}`").format(name=alias_name))
@checks.mod_or_permissions(manage_guild=True)
- @alias.command(name="del")
+ @alias.command(name="delete", aliases=["del", "remove"])
@commands.guild_only()
async def _del_alias(self, ctx: commands.Context, alias_name: str):
"""Delete an existing alias on this server."""
@@ -394,7 +398,7 @@ class Alias(commands.Cog):
await ctx.send(_("Alias with name `{name}` was not found.").format(name=alias_name))
@checks.is_owner()
- @global_.command(name="del")
+ @global_.command(name="delete", aliases=["del", "remove"])
async def _del_global_alias(self, ctx: commands.Context, alias_name: str):
"""Delete an existing global alias."""
aliases = await self.unloaded_global_aliases()
diff --git a/redbot/cogs/alias/locales/ar-SA.po b/redbot/cogs/alias/locales/ar-SA.po
index 593d38628..669298aa3 100644
--- a/redbot/cogs/alias/locales/ar-SA.po
+++ b/redbot/cogs/alias/locales/ar-SA.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: ar_SA\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr ""
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr ""
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr ""
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/bg-BG.po b/redbot/cogs/alias/locales/bg-BG.po
index 7f7ee78d7..184e5e5a7 100644
--- a/redbot/cogs/alias/locales/bg-BG.po
+++ b/redbot/cogs/alias/locales/bg-BG.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Bulgarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: bg_BG\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Няма намерен префикс."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Този псевдоним не съществува."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Няма използвани псевдоними на този сървър."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Няма псевдоними положени към този бот."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Псевдоними:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/cs-CZ.po b/redbot/cogs/alias/locales/cs-CZ.po
new file mode 100644
index 000000000..222605a16
--- /dev/null
+++ b/redbot/cogs/alias/locales/cs-CZ.po
@@ -0,0 +1,154 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: cs\n"
+"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
+"Language: cs_CZ\n"
+
+#: redbot/cogs/alias/alias.py:35
+#, docstring
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr "Vytvořit aliasy pro příkazy n n Aliasy jsou alternativní zkratky pro příkazy. Mohou působit jako lambda (ukládání argumentů pro opakované použití) n nebo jednoduše jako zkratka pro vyslovení \"xyz\" n n Při spuštění budou aliasy přijímat další argumenty a připojovat je k uložený alias. \\ t "
+
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr "Argumenty musí být zadány s číslem."
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr "Argumenty musí být sekvenční. Chybějící argumenty: "
+
+#: redbot/cogs/alias/alias.py:164
+msgid "No prefix found."
+msgstr "Nebyl nalezen žádný prefix."
+
+#: redbot/cogs/alias/alias.py:231
+#, docstring
+msgid "Manage command aliases."
+msgstr "Spravovat aliasy příkazů."
+
+#: redbot/cogs/alias/alias.py:236
+#, docstring
+msgid "Manage global aliases."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:243
+#, docstring
+msgid "Add an alias for a command."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:248
+msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:259
+msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:270
+msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:289
+msgid "A new alias with the trigger `{name}` has been created."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:295
+#, docstring
+msgid "Add a global alias for a command."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:300
+msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:311
+msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:322
+msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:338
+msgid "A new global alias with the trigger `{name}` has been created."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:346
+#, docstring
+msgid "Try to execute help for the base command of the alias."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:355
+msgid "{prefix}help {command}"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:360
+msgid "No such alias exists."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:365
+#, docstring
+msgid "Show what command the alias executes."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:370
+msgid "The `{alias_name}` alias will execute the command `{command}`"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:375
+msgid "There is no alias with the name `{name}`"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:381
+#, docstring
+msgid "Delete an existing alias on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
+msgid "There are no aliases on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
+msgid "Alias with the name `{name}` was successfully deleted."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
+msgid "Alias with name `{name}` was not found."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:399
+#, docstring
+msgid "Delete an existing global alias."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:404
+msgid "There are no aliases on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:417
+#, docstring
+msgid "List the available aliases on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
+msgid "Aliases:"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:428
+#, docstring
+msgid "List the available global aliases on this bot."
+msgstr ""
+
diff --git a/redbot/cogs/alias/locales/da-DK.po b/redbot/cogs/alias/locales/da-DK.po
index 59bf88cc2..d41fc1d04 100644
--- a/redbot/cogs/alias/locales/da-DK.po
+++ b/redbot/cogs/alias/locales/da-DK.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Danish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: da_DK\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr ""
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr ""
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr ""
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/de-DE.po b/redbot/cogs/alias/locales/de-DE.po
index f970bb034..2a24bae0f 100644
--- a/redbot/cogs/alias/locales/de-DE.po
+++ b/redbot/cogs/alias/locales/de-DE.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,142 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: de_DE\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
-msgstr "Kreiere Aliasse für Befehle.\n\n"
-" Aliasse sind alternative Namenskürzel für Befehle. Sie\n"
-" können als Lambda dienen (Argumente speichern für wiederholten Gebrauch)\n"
-" oder als Abkürzung um \"x y z\" zu sagen.\n\n"
-" Wenn ausgeführt, akzeptieren Aliase jedes zusätzliche Argument\n"
-" und fügen es dem gespeicherten Alias zu.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr "Argumente müssen mit einer Nummer bestimmt werden."
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr "Argumente müssen sequentiell sein. Fehlende Argumente: "
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Kein Präfix wurde gefunden."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Verwalte die Alias Befehle."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Verwalte die globalen Aliasse."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Füge einen Alias für einen Befehl hinzu."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Du hast versucht, einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Name ist bereits ein Befehl für diesen Bot."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Du hast versucht einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Alias existiert bereits auf dem Server."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du hast versucht einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Name ist ein ungültiger Alias-Name. Alias-Namen dürfen keine Leerzeichen enthalten."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Ein neuer alias mit dem Trigger `{name}` wurde erstellt."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr "Füge einen globalen Alias für einen Befehl hinzu."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen {name} zu erstellen, aber dieser Name ist bereits ein Befehl für diesen Bot."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen {name} zu erstellen, dieser ist jedoch bereits auf diesem Server vorhanden."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen {name} zu erstellen, dieser Name ist jedoch ein ungültiger Alias-Name. Alias-Namen dürfen keine Leerzeichen enthalten."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Ein neuer globaler Alias mit dem Trigger `{name}` wurde erstellt."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Versuche die Hilfe für den Basisbefehl des Alias auszuführen."
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr "{prefix}help {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "So ein Alias ist nicht vorhanden."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr "Zeige den Befehl, welchen der Alias ausführt."
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "Der Alias '{alias_name}' führt den Befehl '{command}' aus"
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr "Kein Alias mit dem Namen '{name}' gefunden"
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Lösche einen bereits existierenden Alias auf diesem Server."
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Es gibt keine Aliasse auf diesem Server."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Der Alias mit dem Namen '{name}' wurde erfolgreich gelöscht."
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr "Kein Alias mit dem Namen '{name}' gefunden."
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr "Lösche einen bereits existierenden globalen Alias."
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Es gibt keine Aliasse in diesem Bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr "Zeige die auf diesem Server verfügbaren Alias."
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Aliasse:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Zeige die verfügbaren globalen Alias von diesem Bot."
diff --git a/redbot/cogs/alias/locales/el-GR.po b/redbot/cogs/alias/locales/el-GR.po
index d283a097b..8dcb7de7b 100644
--- a/redbot/cogs/alias/locales/el-GR.po
+++ b/redbot/cogs/alias/locales/el-GR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: el_GR\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Δεν βρέθηκε πρόθεμα."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr ""
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr ""
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/en-PT.po b/redbot/cogs/alias/locales/en-PT.po
index 964160cf8..61413a7dd 100644
--- a/redbot/cogs/alias/locales/en-PT.po
+++ b/redbot/cogs/alias/locales/en-PT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Pirate English\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: en_PT\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Arrr, no prefix found capt'n!"
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Yer scummy alias don't exist, matey!"
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Alas! Thar be no aliases on this guild."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Shiver me timbers! Thar be no aliases on this bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Yar Aliases:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/es-ES.po b/redbot/cogs/alias/locales/es-ES.po
index f2c077a54..8e1cdb632 100644
--- a/redbot/cogs/alias/locales/es-ES.po
+++ b/redbot/cogs/alias/locales/es-ES.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: es_ES\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Prefijo no encontrado."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Un alias no existe."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "No hay los aliases en este servidor."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "No hay el los alias dentro de este bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Alias:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/fi-FI.po b/redbot/cogs/alias/locales/fi-FI.po
index dab869503..5571ddf54 100644
--- a/redbot/cogs/alias/locales/fi-FI.po
+++ b/redbot/cogs/alias/locales/fi-FI.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Finnish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: fi_FI\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr ""
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr ""
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr ""
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/fr-FR.po b/redbot/cogs/alias/locales/fr-FR.po
index 9899b4c9f..fb554d8cc 100644
--- a/redbot/cogs/alias/locales/fr-FR.po
+++ b/redbot/cogs/alias/locales/fr-FR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:11\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,142 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: fr_FR\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
-msgstr "Créée des alias pour les commandes\n\n"
-" Les alias sont des raccourcis de noms alternatifs pour les commandes. Ils\n"
-" peuvent agir comme un lambda (stocker des arguments pour un usage répété)\n"
-" ou comme simplement un raccourci pour dire \"x y z\".\n\n"
-" Lors de leur exécution, les alias accepteront tous les arguments supplémentaires\n"
-" et seront exécutés en plus des arguments stockés dans l'alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr "Créée des alias pour les commandes\\n\\n Les alias sont des raccourcis de noms alternatifs pour les commandes. Ils\\n peuvent agir comme un lambda (stocker des arguments pour un usage répété)\\n ou comme simplement un raccourci pour dire \\\"x y z\\\".\\n\\n Lors de leur exécution, les alias accepteront tous les arguments supplémentaires\\n et seront exécutés en plus des arguments stockés dans l'alias.\\n "
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr "Les arguments doivent être spécifiés avec un nombre."
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr "Les arguments doivent être séquentiels. Arguments manquants : "
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Aucun préfixe trouvé."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Gérer les alias de commandes."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Gérer les alias globaux."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Ajouter un alias à une commande."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Tu as tenté de créer un nouvel alias nommé {name}, mais une commande existe déjà avec ce nom sur ce bot."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Tu as tenté de créer un nouvel alias nommé {name}, mais cet alias existe déjà sur ce serveur."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Tu as tenté de créer un nouvel alias nommé {name}, mais ce nom d'alias est invalide. Les noms d'alias ne peuvent pas contenir d'espaces."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Un nouvel alias avec le déclencheur `{name}` a bien été créé."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr "Ajouter un alias global à une commande."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Tu as tenté de créer un nouvel alias global nommé {name}, mais une commande existe déjà avec ce nom sur ce bot."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Tu as tenté de créer un nouvel alias global nommé {name}, mais cet alias existe déjà sur ce serveur."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Tu as tenté de créer un nouvel alias global nommé {name}, mais ce nom d'alias est invalide. Les noms d'alias ne peuvent pas contenir d'espaces."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Un nouvel alias global avec le déclencheur `{name}` a bien été créé."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Tente d'exécuter l'aide pour la commande de base de l'alias."
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr "{prefix}help {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Cet alias n'existe pas."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr "Affiche la commande que l'alias exécute."
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "L'alias `{alias_name}` exécute la commande `{command}`"
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr "Il n'y a pas d'alias nommé `{name}`"
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Supprime un alias de ce serveur."
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Il n'y a pas d'alias sur ce serveur."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "L'alias nommé `{name}` a bien été supprimé."
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr "L'alias nommé `{name}` n'a pas été trouvé."
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr "Supprime un alias global existant."
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Il n'y a pas d'alias sur ce bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr "Liste les alias disponibles sur ce serveur."
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Alias:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Liste les alias globaux disponibles sur ce bot."
diff --git a/redbot/cogs/alias/locales/hu-HU.po b/redbot/cogs/alias/locales/hu-HU.po
index 574cbc082..6828d0c5e 100644
--- a/redbot/cogs/alias/locales/hu-HU.po
+++ b/redbot/cogs/alias/locales/hu-HU.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Hungarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: hu_HU\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Nem találtható prefix."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Nem létezik ilyen rövidítés."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Nincsenek rövidítések ezen a szerveren."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Nincsenek rövidítések ennél a botnál."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Rövidítések:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/id-ID.po b/redbot/cogs/alias/locales/id-ID.po
index 246d7580b..c5b76cb7a 100644
--- a/redbot/cogs/alias/locales/id-ID.po
+++ b/redbot/cogs/alias/locales/id-ID.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Indonesian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: id_ID\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Awalan tidak ditemukan."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Alias tersebut tidak ditemukan."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Tidak ada alias pada server ini."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Tidak ada alias pada bot ini."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Alias:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/it-IT.po b/redbot/cogs/alias/locales/it-IT.po
index c8ee6dc7e..2c29a2268 100644
--- a/redbot/cogs/alias/locales/it-IT.po
+++ b/redbot/cogs/alias/locales/it-IT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,137 +16,139 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: it_IT\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr "Gli argomenti devono essere specificati con un numero."
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Nessun prefisso trovato."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
-msgstr ""
+msgstr "Gestisci gli alias dei comandi."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
-msgstr ""
+msgstr "Gestisci alias globali."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
-msgstr ""
+msgstr "Aggiungi un alias per un comando."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
-msgstr ""
+msgstr "Hai cercato di creare un nuovo alias con il nome {name}, ma questo nome corrisponde già a un comando su questo bot."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
-msgstr ""
+msgstr "Hai cercato di creare un nuovo alias con il nome {name}, ma questo alias già esiste su questo bot."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
-msgstr ""
+msgstr "Hai cercato di creare un nuovo alias con il nome {name}, ma questo nome non è un nome alias valido. I nomi alias non possono contenere spazi."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
-msgstr ""
+msgstr "È stato creato un nuovo alias con il comando '{name}'."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
-msgstr ""
+msgstr "Aggiungi un alias globale per un comando."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
-msgstr ""
+msgstr "Hai cercato di creare un nuovo alias globale con il nome {name}, ma questo nome corrisponde già a un comando su questo bot."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
-msgstr ""
+msgstr "Hai cercato di creare un nuovo alias globale con il nome {name}, ma questo alias già esiste su questo server."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
-msgstr ""
+msgstr "Hai cercato di creare un nuovo alias globale con il nome {name}, ma questo nome non è un nome alias valido. I nomi alias non possono contenere spazi."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
-msgstr ""
+msgstr "È stato creato un nuovo alias globale con il comando '{name}'."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
-msgstr ""
+msgstr "Prova a eseguire l'aiuto per il comando di base dell'alias."
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
-msgstr ""
+msgstr "{prefix}help {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Non esiste nessun alias con questo nome."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
-msgstr ""
+msgstr "Mostra quale comando viene eseguito dall'alias."
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
-msgstr ""
+msgstr "L'alias `{alias_name}` eseguirà il comando `{command}`"
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
-msgstr ""
+msgstr "Non c'è nessun alias con il nome `{name}`"
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
-msgstr ""
+msgstr "Elimina un alias esistente su questo server."
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Non ci sono alias su questo server."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
-msgstr ""
+msgstr "L'alias con il nome `{name}` è stato eliminato con successo."
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
-msgstr ""
+msgstr "L'alias con il nome `{name}` non è stato trovato."
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
-msgstr ""
+msgstr "Elimina un alias globale esistente."
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
-msgstr "Non ci sono nessun alias su questo bot."
+msgstr "Non ci sono alias su questo bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
-msgstr ""
+msgstr "Elenca gli alias disponibili su questo server."
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Alias:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
-msgstr ""
+msgstr "Elenca gli alias globali disponibili su questo server."
diff --git a/redbot/cogs/alias/locales/ja-JP.po b/redbot/cogs/alias/locales/ja-JP.po
index b112bf878..a81536ce2 100644
--- a/redbot/cogs/alias/locales/ja-JP.po
+++ b/redbot/cogs/alias/locales/ja-JP.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: ja_JP\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "プレフィックスが見つかりません。"
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "そのようなエイリアスはありません。"
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "このサーバにエイリアスはありません。"
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "このボットにはエイリアスはありません。"
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "アリアス:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/ko-KR.po b/redbot/cogs/alias/locales/ko-KR.po
index 8e284bad4..e3ae289bb 100644
--- a/redbot/cogs/alias/locales/ko-KR.po
+++ b/redbot/cogs/alias/locales/ko-KR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Korean\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: ko_KR\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "프리픽스를 찾을 수 없어요."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "그런 별칭은 등록되어 있지 않아요."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "이 서버에 등록된 별칭이 없어요."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "이 봇에 등록된 별칭이 없어요."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "등록된 별칭 리스트 :"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/lol-US.po b/redbot/cogs/alias/locales/lol-US.po
index 65de532ee..6251f23e7 100644
--- a/redbot/cogs/alias/locales/lol-US.po
+++ b/redbot/cogs/alias/locales/lol-US.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: LOLCAT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: lol_US\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Nu prifix findz."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Mange da command aliasez."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Mange da global aliasez."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Addz an alias 4 command."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Nu such aliaz existz."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Serverz hav nu aliazes."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Ther no aliazes :("
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Aliazes:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/nl-NL.po b/redbot/cogs/alias/locales/nl-NL.po
index 8430f04e5..edda0e8e8 100644
--- a/redbot/cogs/alias/locales/nl-NL.po
+++ b/redbot/cogs/alias/locales/nl-NL.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Dutch\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,142 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: nl_NL\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
-msgstr "Maak aliases aan voor een command.\n\n"
-" Aliases zijn een alternatieve naam voor snelkoppelingen. Deze\n"
-" kunnen zich gedragen als een lambda (argumenten opslaan voor herhaald gebruik)\n"
-" of zo simpel als een command: \"x y z\".\n"
-" Wanneer ze worden uitgevoerd, accepteren aliassen aanvullende argumenten\n"
-" en voeg ze toe aan de opgeslagen alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Geen prefix gevonden."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Beheer commandaliassen."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Beheer globale aliassen."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Voeg een alias toe voor een opdracht."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Je hebt geprobeerd een nieuwe alias te maken met de naam {name}, maar die naam is al een opdracht voor deze bot."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Je hebt geprobeerd een nieuwe alias te maken met de naam {name}, maar die alias bestaat al op deze server."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Je hebt geprobeerd een nieuwe alias te maken met de naam {name}, maar die naam is een ongeldige aliasnaam. Aliasnamen mogen geen spaties bevatten."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Er is een nieuwe alias gemaakt met de trigger `{name}`."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr "Voeg een globale alias toe voor een opdracht."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Je hebt geprobeerd om een nieuwe globale alias te maken met de naam {name}, maar die naam is al een opdracht op deze bot."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Je hebt geprobeerd een nieuwe globale alias te maken met de naam {name}, maar die alias bestaat al op deze server."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Je hebt geprobeerd een nieuwe algemene alias te maken met de naam {name}, maar die naam is een ongeldige aliasnaam. Aliasnamen mogen geen spaties bevatten."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Er is een nieuwe globale alias gemaakt met de trigger `{name}`."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Probeer hulp uit te voeren voor de basisopdracht van de alias."
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr "{prefix}help {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Deze alias bestaat niet."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr "Laat zien welk commando de alias uitvoert."
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "De `{alias_name}` alias voert het commando `{command}` uit"
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr "Er is geen alias met de naam'{name}'"
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Verwijder een bestaande alias op deze server."
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Er zijn geen aliases in deze server."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Alias met de naam `{name}` is succesvol verwijderd."
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr "Alias met naam `{name}` is niet gevonden."
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr "Een bestaande globale alias verwijderen."
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Er zijn geen aliases op deze bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr "Maak een lijst van de beschikbare aliassen op deze server."
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Aliassen:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Maak een lijst van de beschikbare globale aliassen op deze bot."
diff --git a/redbot/cogs/alias/locales/no-NO.po b/redbot/cogs/alias/locales/no-NO.po
index e057b974d..292a8d81c 100644
--- a/redbot/cogs/alias/locales/no-NO.po
+++ b/redbot/cogs/alias/locales/no-NO.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Norwegian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,138 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: no_NO\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
-msgstr "Opprett aliaser for kommandoer.\n\n"
-"Aliaser er alternative navn snarveier for kommandoer. De kan brukes både som en lambda (lagring av argumenter for gjentatt bruk) eller som en snarvei for å si \"x y z\"\n\n"
-"Aliaser vil godta hvilke som helst tilleggsargumenter og legge dem til det lagrede aliaset når de blir kjørt. "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr "Argumenter må spesifiseres med et nummer."
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Ingen prefiks funnet."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Administrer kommando aliaser."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Administrer globale aliaser."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Legg til et alias for en kommando."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men navnet er allerede en kommando på denne boten."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men aliaset finnes allerede på denne serveren."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men navnet er et ugyldig aliasnavn. Aliasnavn kan ikke inneholde mellomrom."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Et nytt alias med utløseren \"{name}\" har blitt opprettet."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr "Legg til et globalt alias for en kommando."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Du forsøkte å opprette et nytt globalt alias med navnet {navn} men navnet er allerede en kommando på denne boten."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Du forsøkte å opprette et nytt alias med navnet {navn} men aliaset finnes allerede på denne serveren."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du forsøkte å opprette et nytt globalt alias med navnet {name} men navnet er et ugyldig aliasnavn. Aliasnavn kan ikke inneholde mellomrom."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Et nytt globalt alias med utløseren '{name}' har blitt opprettet."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Ingen slike alias finnes."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Det er ingen aliaser på denne serveren."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Det er ingen aliaser på denne boten."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Aliaser:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/pl-PL.po b/redbot/cogs/alias/locales/pl-PL.po
index 587659aeb..ab5315419 100644
--- a/redbot/cogs/alias/locales/pl-PL.po
+++ b/redbot/cogs/alias/locales/pl-PL.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Polish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: pl_PL\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Nie znaleziono prefiksu."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
-msgstr ""
+msgstr "{prefix}help {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Taki alias nie istnieje."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Nie ma aliasów na tym serwerze."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Nie ma żadnych aliasów dla tego bota."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Aliasy:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/pt-BR.po b/redbot/cogs/alias/locales/pt-BR.po
index 4f881f4b3..d6845397a 100644
--- a/redbot/cogs/alias/locales/pt-BR.po
+++ b/redbot/cogs/alias/locales/pt-BR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Portuguese, Brazilian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: pt_BR\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Nenhum prefixo encontrado."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Alias inexistente."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Não há nenhum alias neste servidor."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Não há nenhum alias nesse bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Alias:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/pt-PT.po b/redbot/cogs/alias/locales/pt-PT.po
index adae8999d..6743a13f8 100644
--- a/redbot/cogs/alias/locales/pt-PT.po
+++ b/redbot/cogs/alias/locales/pt-PT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: pt_PT\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr ""
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr ""
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr ""
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/ro-RO.po b/redbot/cogs/alias/locales/ro-RO.po
new file mode 100644
index 000000000..0e8034b0e
--- /dev/null
+++ b/redbot/cogs/alias/locales/ro-RO.po
@@ -0,0 +1,154 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:09\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Romanian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: ro\n"
+"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
+"Language: ro_RO\n"
+
+#: redbot/cogs/alias/alias.py:35
+#, docstring
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
+msgid "No prefix found."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:231
+#, docstring
+msgid "Manage command aliases."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:236
+#, docstring
+msgid "Manage global aliases."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:243
+#, docstring
+msgid "Add an alias for a command."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:248
+msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:259
+msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:270
+msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:289
+msgid "A new alias with the trigger `{name}` has been created."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:295
+#, docstring
+msgid "Add a global alias for a command."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:300
+msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:311
+msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:322
+msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:338
+msgid "A new global alias with the trigger `{name}` has been created."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:346
+#, docstring
+msgid "Try to execute help for the base command of the alias."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:355
+msgid "{prefix}help {command}"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:360
+msgid "No such alias exists."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:365
+#, docstring
+msgid "Show what command the alias executes."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:370
+msgid "The `{alias_name}` alias will execute the command `{command}`"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:375
+msgid "There is no alias with the name `{name}`"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:381
+#, docstring
+msgid "Delete an existing alias on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
+msgid "There are no aliases on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
+msgid "Alias with the name `{name}` was successfully deleted."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
+msgid "Alias with name `{name}` was not found."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:399
+#, docstring
+msgid "Delete an existing global alias."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:404
+msgid "There are no aliases on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:417
+#, docstring
+msgid "List the available aliases on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
+msgid "Aliases:"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:428
+#, docstring
+msgid "List the available global aliases on this bot."
+msgstr ""
+
diff --git a/redbot/cogs/alias/locales/ru-RU.po b/redbot/cogs/alias/locales/ru-RU.po
index 2be47b159..835bcd513 100644
--- a/redbot/cogs/alias/locales/ru-RU.po
+++ b/redbot/cogs/alias/locales/ru-RU.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 05:52\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,142 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: ru_RU\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
-msgstr "Создать псевдонимы для команд.\n\n"
-" Псевдонимы - это альтернативные сочетания имен для команд.\n"
-" Они могут действовать как лямбда (хранение аргументов для\n"
-" многократного использования) или просто как ярлык «а б в».\n\n"
-" При запуске псевдонимы принимают любые дополнительные\n"
-" аргументы и добавляют их к сохраненному псевдониму.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr "Аргументы должны быть указаны с числом."
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr "Аргументы должны быть последовательными. Отсутствующие аргументы: "
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Префикс не найден."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Управление псевдонимами команд."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Управление глобальными псевдонимами."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Добавить псевдоним для команды."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
-msgstr "Вы попытались создать новый псевдоним с именем {name}, но это имя уже является командой для этого бота."
+msgstr "Вы попытались создать новый псевдоним {name}, но это имя уже является командой для этого бота."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
-msgstr "Вы попытались создать новый псевдоним с именем {name}, но этот псевдоним уже существует на этом сервере."
+msgstr "Вы пытались создать новый псевдоним {name}, но этот псевдоним уже существует на этом сервере."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
-msgstr "Вы попытались создать новый псевдоним с именем {name}, но это имя является недопустимым псевдонимом. Имена псевдонимов могут не содержать пробелов."
+msgstr "Вы попытались создать новый псевдоним {name}, но это имя является недопустимым псевдонимом. Имена псевдонимов не могут содержать пробелов."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Новый псевдоним с триггером `{name}` был создан."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr "Добавить глобальный псевдоним для команды."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
-msgstr "Вы попытались создать новый глобальный псевдоним с именем {name}, но это имя уже является командой для этого бота."
+msgstr "Вы попытались создать новый глобальный псевдоним {name}, но это имя уже является командой для этого бота."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
-msgstr "Вы попытались создать новый глобальный псевдоним с именем {name}, но этот псевдоним уже существует на этом сервере."
+msgstr "Вы попытались создать новый глобальный псевдоним {name}, но этот псевдоним уже существует на этом сервере."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
-msgstr "Вы попытались создать новый глобальный псевдоним с именем {name}, но это имя является недопустимым псевдонимом. Имена псевдонимов могут не содержать пробелов."
+msgstr "Вы попытались создать новый глобальный псевдоним {name}, но это имя является недопустимым псевдонимом. Имена псевдонимов не могут содержать пробелов."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Новый глобальный псевдоним с триггером `{name}` был создан."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
-msgstr "Попробуйте выполнить справку для базовой команды псевдонима."
+msgstr "Попробуйте вызвать справку для базовой команды псевдонима."
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr "{prefix}help {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
-msgstr "Псевдоним не найден."
+msgstr "Псевдоним не существует."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr "Показать, какую команду выполняет псевдоним."
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "Псевдоним `{alias_name}` будет выполнять команду `{command}`"
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr "Нет псевдонима с именем `{name}`"
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Удалить существующий псевдоним на этом сервере."
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "На этом сервере нет псевдонимов."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Псевдоним с именем `{name}` был успешно удален."
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr "Псевдоним с именем `{name}` не найден."
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr "Удалить существующий глобальный псевдоним."
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "У этого бота нет псевдонимов."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr "Список доступных псевдонимов на этом сервере."
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Псевдонимы:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Список доступных глобальных псевдонимов для этого бота."
diff --git a/redbot/cogs/alias/locales/sk-SK.po b/redbot/cogs/alias/locales/sk-SK.po
index f5c14f9c4..d2445185e 100644
--- a/redbot/cogs/alias/locales/sk-SK.po
+++ b/redbot/cogs/alias/locales/sk-SK.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Slovak\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: sk_SK\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr ""
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr ""
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr ""
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/sv-SE.po b/redbot/cogs/alias/locales/sv-SE.po
index d456d95d9..7048f3f9f 100644
--- a/redbot/cogs/alias/locales/sv-SE.po
+++ b/redbot/cogs/alias/locales/sv-SE.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: sv_SE\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Inget prefix hittat."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Detta alias existerar inte."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Det finns inga alias på denna server."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Det finns inga alias för denna bot."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Alias:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/tr-TR.po b/redbot/cogs/alias/locales/tr-TR.po
index eb73c99a9..f633269bf 100644
--- a/redbot/cogs/alias/locales/tr-TR.po
+++ b/redbot/cogs/alias/locales/tr-TR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Turkish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: tr_TR\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "Öneki bulundu."
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr "Komut diğer adları yönetmek."
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr "Küresel diğer adları yönetmek."
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr "Bir komut için bir diğer ad ekleyin."
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı, ancak bu adı zaten bu bot bir komutudur."
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı, ancak bu diğer adı bu sunucuda zaten vardır."
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı ama o ismi geçersiz diğer ad. Diğer ad ad adlar boşluk içeremez."
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Yeni bir takma ad tetikleyici '{name}' ile oluşturuldu."
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr "Bir komut için küresel bir diğer ad ekleyin."
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Yeni bir küresel diğer adı ile ad {name} oluşturmak çalıştı, ancak bu adı zaten bu bot bir komutudur."
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı, ancak bu adı zaten bu bot bir komutudur."
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Yeni bir küresel diğer adı ile ad {name} oluşturmaya çalıştı ama o ismi geçersiz diğer ad. Diğer ad ad adlar boşluk içeremez."
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Yeni bir küresel diğer ad tetikleyici '{name}' ile oluşturuldu."
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Diğer temel komutunun yardımını yürütmek deneyin."
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr "{prefix}yardımcı {command}"
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "Böyle bir takma var yok."
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr "Takma adın çalıştırıldığı komutu gösterin."
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "'{alias_name}' diğer ad komut '{command} ' idam edecek"
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr "Hiç diğer ad ad '{name} ' ile olduğunu"
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Bu sunucuda varolan bir diğer adı silin."
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "Bu sunucuda hiçbir diğer adları vardır."
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "`{name}`adlı takma ad başarıyla silindi."
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr "{Name} `adlı takma ad bulunamadı."
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr "Mevcut bir global takma adı silin."
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "Bu botta takma adlar yok."
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr "Bu sunucudaki kullanılabilir diğer adları listeleyin."
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "Takma adlar:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Bu botta mevcut küresel takma adları listeleyiniz."
diff --git a/redbot/cogs/alias/locales/zh-CN.po b/redbot/cogs/alias/locales/zh-CN.po
index 494d998f5..07772e024 100644
--- a/redbot/cogs/alias/locales/zh-CN.po
+++ b/redbot/cogs/alias/locales/zh-CN.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-01-11 02:18+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Chinese Simplified\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,136 +16,138 @@ msgstr ""
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"Language: zh_CN\n"
-#: redbot/cogs/alias/alias.py:18
+#: redbot/cogs/alias/alias.py:35
#, docstring
-msgid "Create aliases for commands.\n\n"
-" Aliases are alternative names shortcuts for commands. They\n"
-" can act as both a lambda (storing arguments for repeated use)\n"
-" or as simply a shortcut to saying \"x y z\".\n\n"
-" When run, aliases will accept any additional arguments\n"
-" and append them to the stored alias.\n"
-" "
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
-#: redbot/cogs/alias/alias.py:130
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
msgid "No prefix found."
msgstr "找不到前缀"
-#: redbot/cogs/alias/alias.py:179
+#: redbot/cogs/alias/alias.py:231
#, docstring
msgid "Manage command aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:184
+#: redbot/cogs/alias/alias.py:236
#, docstring
msgid "Manage global aliases."
msgstr ""
-#: redbot/cogs/alias/alias.py:191
+#: redbot/cogs/alias/alias.py:243
#, docstring
msgid "Add an alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:196
+#: redbot/cogs/alias/alias.py:248
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:207
+#: redbot/cogs/alias/alias.py:259
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:218
+#: redbot/cogs/alias/alias.py:270
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:234
+#: redbot/cogs/alias/alias.py:289
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:240
+#: redbot/cogs/alias/alias.py:295
#, docstring
msgid "Add a global alias for a command."
msgstr ""
-#: redbot/cogs/alias/alias.py:245
+#: redbot/cogs/alias/alias.py:300
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
-#: redbot/cogs/alias/alias.py:256
+#: redbot/cogs/alias/alias.py:311
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:267
+#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
-#: redbot/cogs/alias/alias.py:280
+#: redbot/cogs/alias/alias.py:338
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
-#: redbot/cogs/alias/alias.py:288
+#: redbot/cogs/alias/alias.py:346
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:297
+#: redbot/cogs/alias/alias.py:355
msgid "{prefix}help {command}"
msgstr ""
-#: redbot/cogs/alias/alias.py:302
+#: redbot/cogs/alias/alias.py:360
msgid "No such alias exists."
msgstr "不存在该别名。"
-#: redbot/cogs/alias/alias.py:307
+#: redbot/cogs/alias/alias.py:365
#, docstring
msgid "Show what command the alias executes."
msgstr ""
-#: redbot/cogs/alias/alias.py:312
+#: redbot/cogs/alias/alias.py:370
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:317
+#: redbot/cogs/alias/alias.py:375
msgid "There is no alias with the name `{name}`"
msgstr ""
-#: redbot/cogs/alias/alias.py:323
+#: redbot/cogs/alias/alias.py:381
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:328 redbot/cogs/alias/alias.py:364
-#: redbot/cogs/alias/alias.py:375
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
msgid "There are no aliases on this server."
msgstr "在这个服务器上没有别名。"
-#: redbot/cogs/alias/alias.py:333 redbot/cogs/alias/alias.py:351
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
-#: redbot/cogs/alias/alias.py:336 redbot/cogs/alias/alias.py:354
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
msgid "Alias with name `{name}` was not found."
msgstr ""
-#: redbot/cogs/alias/alias.py:341
+#: redbot/cogs/alias/alias.py:399
#, docstring
msgid "Delete an existing global alias."
msgstr ""
-#: redbot/cogs/alias/alias.py:346
+#: redbot/cogs/alias/alias.py:404
msgid "There are no aliases on this bot."
msgstr "这个机器人上没有别名。"
-#: redbot/cogs/alias/alias.py:359
+#: redbot/cogs/alias/alias.py:417
#, docstring
msgid "List the available aliases on this server."
msgstr ""
-#: redbot/cogs/alias/alias.py:360 redbot/cogs/alias/alias.py:371
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
msgid "Aliases:"
msgstr "别名:"
-#: redbot/cogs/alias/alias.py:370
+#: redbot/cogs/alias/alias.py:428
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
diff --git a/redbot/cogs/alias/locales/zh-TW.po b/redbot/cogs/alias/locales/zh-TW.po
new file mode 100644
index 000000000..3aa21cfbe
--- /dev/null
+++ b/redbot/cogs/alias/locales/zh-TW.po
@@ -0,0 +1,154 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Chinese Traditional\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: zh-TW\n"
+"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
+"Language: zh_TW\n"
+
+#: redbot/cogs/alias/alias.py:35
+#, docstring
+msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:107
+msgid "Arguments must be specified with a number."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:114
+msgid "Arguments must be sequential. Missing arguments: "
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:164
+msgid "No prefix found."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:231
+#, docstring
+msgid "Manage command aliases."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:236
+#, docstring
+msgid "Manage global aliases."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:243
+#, docstring
+msgid "Add an alias for a command."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:248
+msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:259
+msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:270
+msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:289
+msgid "A new alias with the trigger `{name}` has been created."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:295
+#, docstring
+msgid "Add a global alias for a command."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:300
+msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:311
+msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:322
+msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:338
+msgid "A new global alias with the trigger `{name}` has been created."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:346
+#, docstring
+msgid "Try to execute help for the base command of the alias."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:355
+msgid "{prefix}help {command}"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:360
+msgid "No such alias exists."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:365
+#, docstring
+msgid "Show what command the alias executes."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:370
+msgid "The `{alias_name}` alias will execute the command `{command}`"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:375
+msgid "There is no alias with the name `{name}`"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:381
+#, docstring
+msgid "Delete an existing alias on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:386 redbot/cogs/alias/alias.py:422
+#: redbot/cogs/alias/alias.py:433
+msgid "There are no aliases on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:391 redbot/cogs/alias/alias.py:409
+msgid "Alias with the name `{name}` was successfully deleted."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:394 redbot/cogs/alias/alias.py:412
+msgid "Alias with name `{name}` was not found."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:399
+#, docstring
+msgid "Delete an existing global alias."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:404
+msgid "There are no aliases on this bot."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:417
+#, docstring
+msgid "List the available aliases on this server."
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:418 redbot/cogs/alias/alias.py:429
+msgid "Aliases:"
+msgstr ""
+
+#: redbot/cogs/alias/alias.py:428
+#, docstring
+msgid "List the available global aliases on this bot."
+msgstr ""
+
diff --git a/redbot/cogs/audio/apis.py b/redbot/cogs/audio/apis.py
new file mode 100644
index 000000000..31f208da2
--- /dev/null
+++ b/redbot/cogs/audio/apis.py
@@ -0,0 +1,1135 @@
+import asyncio
+import base64
+import contextlib
+import datetime
+import json
+import logging
+import os
+import random
+import time
+import traceback
+from collections import namedtuple
+from typing import Callable, Dict, List, Mapping, NoReturn, Optional, Tuple, Union
+
+try:
+ from sqlite3 import Error as SQLError
+ from databases import Database
+
+ HAS_SQL = True
+ _ERROR = None
+except ImportError as err:
+ _ERROR = "".join(traceback.format_exception_only(type(err), err)).strip()
+ HAS_SQL = False
+ SQLError = err.__class__
+ Database = None
+
+
+import aiohttp
+import discord
+import lavalink
+from lavalink.rest_api import LoadResult
+
+from redbot.core import Config, commands
+from redbot.core.bot import Red
+from redbot.core.i18n import Translator, cog_i18n
+from . import dataclasses
+from .errors import InvalidTableError, SpotifyFetchError, YouTubeApiError
+from .playlists import get_playlist
+from .utils import CacheLevel, Notifier, is_allowed, queue_duration, track_limit
+
+log = logging.getLogger("red.audio.cache")
+_ = Translator("Audio", __file__)
+
+_DROP_YOUTUBE_TABLE = "DROP TABLE youtube;"
+
+_CREATE_YOUTUBE_TABLE = """
+ CREATE TABLE IF NOT EXISTS youtube(
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ track_info TEXT,
+ youtube_url TEXT,
+ last_updated TEXT,
+ last_fetched TEXT
+ );
+ """
+
+_CREATE_UNIQUE_INDEX_YOUTUBE_TABLE = (
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_youtube_url ON youtube (track_info, youtube_url);"
+)
+
+_INSERT_YOUTUBE_TABLE = """
+ INSERT OR REPLACE INTO
+ youtube(track_info, youtube_url, last_updated, last_fetched)
+ VALUES (:track_info, :track_url, :last_updated, :last_fetched);
+ """
+_QUERY_YOUTUBE_TABLE = "SELECT * FROM youtube WHERE track_info=:track;"
+_UPDATE_YOUTUBE_TABLE = """UPDATE youtube
+ SET last_fetched=:last_fetched
+ WHERE track_info=:track;"""
+
+_DROP_SPOTIFY_TABLE = "DROP TABLE spotify;"
+
+_CREATE_UNIQUE_INDEX_SPOTIFY_TABLE = (
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_spotify_uri ON spotify (id, type, uri);"
+)
+
+_CREATE_SPOTIFY_TABLE = """
+ CREATE TABLE IF NOT EXISTS spotify(
+ id TEXT,
+ type TEXT,
+ uri TEXT,
+ track_name TEXT,
+ artist_name TEXT,
+ song_url TEXT,
+ track_info TEXT,
+ last_updated TEXT,
+ last_fetched TEXT
+ );
+ """
+
+_INSERT_SPOTIFY_TABLE = """
+ INSERT OR REPLACE INTO
+ spotify(id, type, uri, track_name, artist_name,
+ song_url, track_info, last_updated, last_fetched)
+ VALUES (:id, :type, :uri, :track_name, :artist_name,
+ :song_url, :track_info, :last_updated, :last_fetched);
+ """
+_QUERY_SPOTIFY_TABLE = "SELECT * FROM spotify WHERE uri=:uri;"
+_UPDATE_SPOTIFY_TABLE = """UPDATE spotify
+ SET last_fetched=:last_fetched
+ WHERE uri=:uri;"""
+
+_DROP_LAVALINK_TABLE = "DROP TABLE lavalink;"
+
+_CREATE_LAVALINK_TABLE = """
+ CREATE TABLE IF NOT EXISTS lavalink(
+ query TEXT,
+ data BLOB,
+ last_updated TEXT,
+ last_fetched TEXT
+
+ );
+ """
+
+_CREATE_UNIQUE_INDEX_LAVALINK_TABLE = (
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_lavalink_query ON lavalink (query);"
+)
+
+_INSERT_LAVALINK_TABLE = """
+ INSERT OR REPLACE INTO
+ lavalink(query, data, last_updated, last_fetched)
+ VALUES (:query, :data, :last_updated, :last_fetched);
+ """
+_QUERY_LAVALINK_TABLE = "SELECT * FROM lavalink WHERE query=:query;"
+_QUERY_LAST_FETCHED_LAVALINK_TABLE = (
+ "SELECT * FROM lavalink "
+ "WHERE last_fetched LIKE :day1"
+ " OR last_fetched LIKE :day2"
+ " OR last_fetched LIKE :day3"
+ " OR last_fetched LIKE :day4"
+ " OR last_fetched LIKE :day5"
+ " OR last_fetched LIKE :day6"
+ " OR last_fetched LIKE :day7;"
+)
+_UPDATE_LAVALINK_TABLE = """UPDATE lavalink
+ SET last_fetched=:last_fetched
+ WHERE query=:query;"""
+
+_PARSER = {
+ "youtube": {
+ "insert": _INSERT_YOUTUBE_TABLE,
+ "youtube_url": {"query": _QUERY_YOUTUBE_TABLE},
+ "update": _UPDATE_YOUTUBE_TABLE,
+ },
+ "spotify": {
+ "insert": _INSERT_SPOTIFY_TABLE,
+ "track_info": {"query": _QUERY_SPOTIFY_TABLE},
+ "update": _UPDATE_SPOTIFY_TABLE,
+ },
+ "lavalink": {
+ "insert": _INSERT_LAVALINK_TABLE,
+ "data": {"query": _QUERY_LAVALINK_TABLE, "played": _QUERY_LAST_FETCHED_LAVALINK_TABLE},
+ "update": _UPDATE_LAVALINK_TABLE,
+ },
+}
+
+_TOP_100_GLOBALS = "https://www.youtube.com/playlist?list=PL4fGSI1pDJn6puJdseH2Rt9sMvt9E2M4i"
+_TOP_100_US = "https://www.youtube.com/playlist?list=PL4fGSI1pDJn5rWitrRWFKdm-ulaFiIyoK"
+
+
+class SpotifyAPI:
+ """Wrapper for the Spotify API."""
+
+ def __init__(self, bot: Red, session: aiohttp.ClientSession):
+ self.bot = bot
+ self.session = session
+ self.spotify_token = None
+ self.client_id = None
+ self.client_secret = None
+
+ @staticmethod
+ async def _check_token(token: dict):
+ now = int(time.time())
+ return token["expires_at"] - now < 60
+
+ @staticmethod
+ def _make_token_auth(client_id: Optional[str], client_secret: Optional[str]) -> dict:
+ if client_id is None:
+ client_id = ""
+ if client_secret is None:
+ client_secret = ""
+
+ auth_header = base64.b64encode((client_id + ":" + client_secret).encode("ascii"))
+ return {"Authorization": "Basic %s" % auth_header.decode("ascii")}
+
+ async def _make_get(self, url: str, headers: dict = None, params: dict = None) -> dict:
+ if params is None:
+ params = {}
+ async with self.session.request("GET", url, params=params, headers=headers) as r:
+ if r.status != 200:
+ log.debug(
+ "Issue making GET request to {0}: [{1.status}] {2}".format(
+ url, r, await r.json()
+ )
+ )
+ return await r.json()
+
+ async def _get_auth(self) -> NoReturn:
+ if self.client_id is None or self.client_secret is None:
+ tokens = await self.bot.get_shared_api_tokens("spotify")
+ self.client_id = tokens.get("client_id", "")
+ self.client_secret = tokens.get("client_secret", "")
+
+ async def _request_token(self) -> dict:
+ await self._get_auth()
+
+ payload = {"grant_type": "client_credentials"}
+ headers = self._make_token_auth(self.client_id, self.client_secret)
+ r = await self.post_call(
+ "https://accounts.spotify.com/api/token", payload=payload, headers=headers
+ )
+ return r
+
+ async def _get_spotify_token(self) -> Optional[str]:
+ if self.spotify_token and not await self._check_token(self.spotify_token):
+ return self.spotify_token["access_token"]
+ token = await self._request_token()
+ if token is None:
+ log.debug("Requested a token from Spotify, did not end up getting one.")
+ try:
+ token["expires_at"] = int(time.time()) + token["expires_in"]
+ except KeyError:
+ return
+ self.spotify_token = token
+ log.debug("Created a new access token for Spotify: {0}".format(token))
+ return self.spotify_token["access_token"]
+
+ async def post_call(self, url: str, payload: dict, headers: dict = None) -> dict:
+ async with self.session.post(url, data=payload, headers=headers) as r:
+ if r.status != 200:
+ log.debug(
+ "Issue making POST request to {0}: [{1.status}] {2}".format(
+ url, r, await r.json()
+ )
+ )
+ return await r.json()
+
+ async def get_call(self, url: str, params: dict) -> dict:
+ token = await self._get_spotify_token()
+ return await self._make_get(
+ url, params=params, headers={"Authorization": "Bearer {0}".format(token)}
+ )
+
+ async def get_categories(self) -> List[Dict[str, str]]:
+ url = "https://api.spotify.com/v1/browse/categories"
+ params = {}
+ result = await self.get_call(url, params=params)
+ with contextlib.suppress(KeyError):
+ if result["error"]["status"] == 401:
+ raise SpotifyFetchError(
+ message=(
+ "The Spotify API key or client secret has not been set properly. "
+ "\nUse `{prefix}audioset spotifyapi` for instructions."
+ )
+ )
+ categories = result.get("categories", {}).get("items", [])
+ return [{c["name"]: c["id"]} for c in categories]
+
+ async def get_playlist_from_category(self, category: str):
+ url = f"https://api.spotify.com/v1/browse/categories/{category}/playlists"
+ params = {}
+ result = await self.get_call(url, params=params)
+ playlists = result.get("playlists", {}).get("items", [])
+ return [
+ {
+ "name": c["name"],
+ "uri": c["uri"],
+ "url": c.get("external_urls", {}).get("spotify"),
+ "tracks": c.get("tracks", {}).get("total", "Unknown"),
+ }
+ for c in playlists
+ ]
+
+
+class YouTubeAPI:
+ """Wrapper for the YouTube Data API."""
+
+ def __init__(self, bot: Red, session: aiohttp.ClientSession):
+ self.bot = bot
+ self.session = session
+ self.api_key = None
+
+ async def _get_api_key(self,) -> Optional[str]:
+ if self.api_key is None:
+ tokens = await self.bot.get_shared_api_tokens("youtube")
+ self.api_key = tokens.get("api_key", "")
+ return self.api_key
+
+ async def get_call(self, query: str) -> Optional[str]:
+ params = {
+ "q": query,
+ "part": "id",
+ "key": await self._get_api_key(),
+ "maxResults": 1,
+ "type": "video",
+ }
+ yt_url = "https://www.googleapis.com/youtube/v3/search"
+ async with self.session.request("GET", yt_url, params=params) as r:
+ if r.status in [400, 404]:
+ return None
+ elif r.status in [403, 429]:
+ if r.reason == "quotaExceeded":
+ raise YouTubeApiError("Your YouTube Data API quota has been reached.")
+
+ return None
+ else:
+ search_response = await r.json()
+ for search_result in search_response.get("items", []):
+ if search_result["id"]["kind"] == "youtube#video":
+ return f"https://www.youtube.com/watch?v={search_result['id']['videoId']}"
+
+
+@cog_i18n(_)
+class MusicCache:
+ """
+ Handles music queries to the Spotify and Youtube Data API.
+ Always tries the Cache first.
+ """
+
+ def __init__(self, bot: Red, session: aiohttp.ClientSession, path: str):
+ self.bot = bot
+ self.spotify_api: SpotifyAPI = SpotifyAPI(bot, session)
+ self.youtube_api: YouTubeAPI = YouTubeAPI(bot, session)
+ self._session: aiohttp.ClientSession = session
+ if HAS_SQL:
+ self.database: Database = Database(
+ f'sqlite:///{os.path.abspath(str(os.path.join(path, "cache.db")))}'
+ )
+ else:
+ self.database = None
+
+ self._tasks: dict = {}
+ self._lock: asyncio.Lock = asyncio.Lock()
+ self.config: Optional[Config] = None
+
+ async def initialize(self, config: Config) -> NoReturn:
+ if HAS_SQL:
+ await self.database.connect()
+
+ await self.database.execute(query="PRAGMA temp_store = 2;")
+ await self.database.execute(query="PRAGMA journal_mode = wal;")
+ await self.database.execute(query="PRAGMA wal_autocheckpoint;")
+ await self.database.execute(query="PRAGMA read_uncommitted = 1;")
+
+ await self.database.execute(query=_CREATE_LAVALINK_TABLE)
+ await self.database.execute(query=_CREATE_UNIQUE_INDEX_LAVALINK_TABLE)
+ await self.database.execute(query=_CREATE_YOUTUBE_TABLE)
+ await self.database.execute(query=_CREATE_UNIQUE_INDEX_YOUTUBE_TABLE)
+ await self.database.execute(query=_CREATE_SPOTIFY_TABLE)
+ await self.database.execute(query=_CREATE_UNIQUE_INDEX_SPOTIFY_TABLE)
+ self.config = config
+
+ async def close(self) -> NoReturn:
+ if HAS_SQL:
+ await self.database.execute(query="PRAGMA optimize;")
+ await self.database.disconnect()
+
+ async def insert(self, table: str, values: List[dict]) -> NoReturn:
+ # if table == "spotify":
+ # return
+ if HAS_SQL:
+ query = _PARSER.get(table, {}).get("insert")
+ if query is None:
+ raise InvalidTableError(f"{table} is not a valid table in the database.")
+
+ await self.database.execute_many(query=query, values=values)
+
+ async def update(self, table: str, values: Dict[str, str]) -> NoReturn:
+ # if table == "spotify":
+ # return
+ if HAS_SQL:
+ table = _PARSER.get(table, {})
+ sql_query = table.get("update")
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+ values["last_fetched"] = time_now
+ if not table:
+ raise InvalidTableError(f"{table} is not a valid table in the database.")
+ await self.database.fetch_one(query=sql_query, values=values)
+
+ async def fetch_one(
+ self, table: str, query: str, values: Dict[str, str]
+ ) -> Tuple[Optional[str], bool]:
+ table = _PARSER.get(table, {})
+ sql_query = table.get(query, {}).get("query")
+ if HAS_SQL:
+ if not table:
+ raise InvalidTableError(f"{table} is not a valid table in the database.")
+
+ row = await self.database.fetch_one(query=sql_query, values=values)
+ last_updated = getattr(row, "last_updated", None)
+ need_update = True
+ with contextlib.suppress(TypeError):
+ if last_updated:
+ last_update = datetime.datetime.fromisoformat(
+ last_updated
+ ) + datetime.timedelta(days=await self.config.cache_age())
+ last_update.replace(tzinfo=datetime.timezone.utc)
+
+ need_update = last_update < datetime.datetime.now(datetime.timezone.utc)
+
+ return getattr(row, query, None), need_update if table != "spotify" else True
+ else:
+ return None, True
+
+ # TODO: Create a task to remove entries
+ # from DB that haven't been fetched in x days ... customizable by Owner
+
+ async def fetch_all(self, table: str, query: str, values: Dict[str, str]) -> List[Mapping]:
+ if HAS_SQL:
+ table = _PARSER.get(table, {})
+ sql_query = table.get(query, {}).get("played")
+ if not table:
+ raise InvalidTableError(f"{table} is not a valid table in the database.")
+
+ return await self.database.fetch_all(query=sql_query, values=values)
+ return []
+
+ @staticmethod
+ def _spotify_format_call(qtype: str, key: str) -> Tuple[str, dict]:
+ params = {}
+ if qtype == "album":
+ query = "https://api.spotify.com/v1/albums/{0}/tracks".format(key)
+ elif qtype == "track":
+ query = "https://api.spotify.com/v1/tracks/{0}".format(key)
+ else:
+ query = "https://api.spotify.com/v1/playlists/{0}/tracks".format(key)
+ return query, params
+
+ @staticmethod
+ def _get_spotify_track_info(track_data: dict) -> Tuple[str, ...]:
+ artist_name = track_data["artists"][0]["name"]
+ track_name = track_data["name"]
+ track_info = f"{track_name} {artist_name}"
+ song_url = track_data.get("external_urls", {}).get("spotify")
+ uri = track_data["uri"]
+ _id = track_data["id"]
+ _type = track_data["type"]
+
+ return song_url, track_info, uri, artist_name, track_name, _id, _type
+
+ async def _spotify_first_time_query(
+ self,
+ ctx: commands.Context,
+ query_type: str,
+ uri: str,
+ notifier: Notifier,
+ skip_youtube: bool = False,
+ current_cache_level: CacheLevel = CacheLevel.none(),
+ ) -> List[str]:
+ youtube_urls = []
+
+ tracks = await self._spotify_fetch_tracks(query_type, uri, params=None, notifier=notifier)
+ total_tracks = len(tracks)
+ database_entries = []
+ track_count = 0
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+ youtube_cache = CacheLevel.set_youtube().is_subset(current_cache_level)
+ for track in tracks:
+ if track.get("error", {}).get("message") == "invalid id":
+ continue
+ (
+ song_url,
+ track_info,
+ uri,
+ artist_name,
+ track_name,
+ _id,
+ _type,
+ ) = self._get_spotify_track_info(track)
+
+ database_entries.append(
+ {
+ "id": _id,
+ "type": _type,
+ "uri": uri,
+ "track_name": track_name,
+ "artist_name": artist_name,
+ "song_url": song_url,
+ "track_info": track_info,
+ "last_updated": time_now,
+ "last_fetched": time_now,
+ }
+ )
+ if skip_youtube is False:
+ val = None
+ if youtube_cache:
+ update = True
+ with contextlib.suppress(SQLError):
+ val, update = await self.fetch_one(
+ "youtube", "youtube_url", {"track": track_info}
+ )
+ if update:
+ val = None
+ if val is None:
+ val = await self._youtube_first_time_query(
+ ctx, track_info, current_cache_level=current_cache_level
+ )
+ if youtube_cache and val:
+ task = ("update", ("youtube", {"track": track_info}))
+ self.append_task(ctx, *task)
+
+ if val:
+ youtube_urls.append(val)
+ else:
+ youtube_urls.append(track_info)
+ track_count += 1
+ if notifier and ((track_count % 2 == 0) or (track_count == total_tracks)):
+ await notifier.notify_user(current=track_count, total=total_tracks, key="youtube")
+ if CacheLevel.set_spotify().is_subset(current_cache_level):
+ task = ("insert", ("spotify", database_entries))
+ self.append_task(ctx, *task)
+ return youtube_urls
+
+ async def _youtube_first_time_query(
+ self,
+ ctx: commands.Context,
+ track_info: str,
+ current_cache_level: CacheLevel = CacheLevel.none(),
+ ) -> str:
+ track_url = await self.youtube_api.get_call(track_info)
+ if CacheLevel.set_youtube().is_subset(current_cache_level) and track_url:
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+ task = (
+ "insert",
+ (
+ "youtube",
+ [
+ {
+ "track_info": track_info,
+ "track_url": track_url,
+ "last_updated": time_now,
+ "last_fetched": time_now,
+ }
+ ],
+ ),
+ )
+ self.append_task(ctx, *task)
+ return track_url
+
+ async def _spotify_fetch_tracks(
+ self,
+ query_type: str,
+ uri: str,
+ recursive: Union[str, bool] = False,
+ params=None,
+ notifier: Optional[Notifier] = None,
+ ) -> Union[dict, List[str]]:
+
+ if recursive is False:
+ call, params = self._spotify_format_call(query_type, uri)
+ results = await self.spotify_api.get_call(call, params)
+ else:
+ results = await self.spotify_api.get_call(recursive, params)
+ try:
+ if results["error"]["status"] == 401 and not recursive:
+ raise SpotifyFetchError(
+ (
+ "The Spotify API key or client secret has not been set properly. "
+ "\nUse `{prefix}audioset spotifyapi` for instructions."
+ )
+ )
+ elif recursive:
+ return {"next": None}
+ except KeyError:
+ pass
+ if recursive:
+ return results
+ tracks = []
+ track_count = 0
+ total_tracks = results.get("tracks", results).get("total", 1)
+ while True:
+ new_tracks = []
+ if query_type == "track":
+ new_tracks = results
+ tracks.append(new_tracks)
+ elif query_type == "album":
+ tracks_raw = results.get("tracks", results).get("items", [])
+ if tracks_raw:
+ new_tracks = tracks_raw
+ tracks.extend(new_tracks)
+ else:
+ tracks_raw = results.get("tracks", results).get("items", [])
+ if tracks_raw:
+ new_tracks = [k["track"] for k in tracks_raw if k.get("track")]
+ tracks.extend(new_tracks)
+ track_count += len(new_tracks)
+ if notifier:
+ await notifier.notify_user(current=track_count, total=total_tracks, key="spotify")
+
+ try:
+ if results.get("next") is not None:
+ results = await self._spotify_fetch_tracks(
+ query_type, uri, results["next"], params, notifier=notifier
+ )
+ continue
+ else:
+ break
+ except KeyError:
+ raise SpotifyFetchError(
+ "This doesn't seem to be a valid Spotify playlist/album URL or code."
+ )
+
+ return tracks
+
+ async def spotify_query(
+ self,
+ ctx: commands.Context,
+ query_type: str,
+ uri: str,
+ skip_youtube: bool = False,
+ notifier: Optional[Notifier] = None,
+ ) -> List[str]:
+ """
+ Queries the Database then falls back to Spotify and YouTube APIs.
+
+ Parameters
+ ----------
+ ctx: commands.Context
+ The context this method is being called under.
+ query_type : str
+ Type of query to perform (Pl
+ uri: str
+ Spotify URL ID .
+ skip_youtube:bool
+ Whether or not to skip YouTube API Calls.
+ notifier: Notifier
+ A Notifier object to handle the user UI notifications while tracks are loaded.
+ Returns
+ -------
+ List[str]
+ List of Youtube URLs.
+ """
+ current_cache_level = (
+ CacheLevel(await self.config.cache_level()) if HAS_SQL else CacheLevel.none()
+ )
+ cache_enabled = CacheLevel.set_spotify().is_subset(current_cache_level)
+ if query_type == "track" and cache_enabled:
+ update = True
+ with contextlib.suppress(SQLError):
+ val, update = await self.fetch_one(
+ "spotify", "track_info", {"uri": f"spotify:track:{uri}"}
+ )
+ if update:
+ val = None
+ else:
+ val = None
+ youtube_urls = []
+ if val is None:
+ urls = await self._spotify_first_time_query(
+ ctx,
+ query_type,
+ uri,
+ notifier,
+ skip_youtube,
+ current_cache_level=current_cache_level,
+ )
+ youtube_urls.extend(urls)
+ else:
+ if query_type == "track" and cache_enabled:
+ task = ("update", ("spotify", {"uri": f"spotify:track:{uri}"}))
+ self.append_task(ctx, *task)
+ youtube_urls.append(val)
+ return youtube_urls
+
+ async def spotify_enqueue(
+ self,
+ ctx: commands.Context,
+ query_type: str,
+ uri: str,
+ enqueue: bool,
+ player: lavalink.Player,
+ lock: Callable,
+ notifier: Optional[Notifier] = None,
+ ) -> List[lavalink.Track]:
+ track_list = []
+ has_not_allowed = False
+ try:
+ current_cache_level = (
+ CacheLevel(await self.config.cache_level()) if HAS_SQL else CacheLevel.none()
+ )
+ guild_data = await self.config.guild(ctx.guild).all()
+
+ # now = int(time.time())
+ enqueued_tracks = 0
+ consecutive_fails = 0
+ queue_dur = await queue_duration(ctx)
+ queue_total_duration = lavalink.utils.format_time(queue_dur)
+ before_queue_length = len(player.queue)
+ tracks_from_spotify = await self._spotify_fetch_tracks(
+ query_type, uri, params=None, notifier=notifier
+ )
+ total_tracks = len(tracks_from_spotify)
+ if total_tracks < 1:
+ lock(ctx, False)
+ embed3 = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("This doesn't seem to be a supported Spotify URL or code."),
+ )
+ await notifier.update_embed(embed3)
+
+ return track_list
+ database_entries = []
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+
+ youtube_cache = CacheLevel.set_youtube().is_subset(current_cache_level)
+ spotify_cache = CacheLevel.set_spotify().is_subset(current_cache_level)
+ for track_count, track in enumerate(tracks_from_spotify):
+ (
+ song_url,
+ track_info,
+ uri,
+ artist_name,
+ track_name,
+ _id,
+ _type,
+ ) = self._get_spotify_track_info(track)
+
+ database_entries.append(
+ {
+ "id": _id,
+ "type": _type,
+ "uri": uri,
+ "track_name": track_name,
+ "artist_name": artist_name,
+ "song_url": song_url,
+ "track_info": track_info,
+ "last_updated": time_now,
+ "last_fetched": time_now,
+ }
+ )
+ val = None
+ if youtube_cache:
+ update = True
+ with contextlib.suppress(SQLError):
+ val, update = await self.fetch_one(
+ "youtube", "youtube_url", {"track": track_info}
+ )
+ if update:
+ val = None
+ if val is None:
+ val = await self._youtube_first_time_query(
+ ctx, track_info, current_cache_level=current_cache_level
+ )
+ if youtube_cache and val:
+ task = ("update", ("youtube", {"track": track_info}))
+ self.append_task(ctx, *task)
+
+ if val:
+ try:
+ result, called_api = await self.lavalink_query(
+ ctx, player, dataclasses.Query.process_input(val)
+ )
+ except (RuntimeError, aiohttp.ServerDisconnectedError):
+ lock(ctx, False)
+ error_embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("The connection was reset while loading the playlist."),
+ )
+ await notifier.update_embed(error_embed)
+ break
+ except asyncio.TimeoutError:
+ lock(ctx, False)
+ error_embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("Player timedout, skipping remaning tracks."),
+ )
+ await notifier.update_embed(error_embed)
+ break
+ track_object = result.tracks
+ else:
+ track_object = []
+ if (track_count % 2 == 0) or (track_count == total_tracks):
+ key = "lavalink"
+ seconds = "???"
+ second_key = None
+ # if track_count == 2:
+ # five_time = int(time.time()) - now
+ # if track_count >= 2:
+ # remain_tracks = total_tracks - track_count
+ # time_remain = (remain_tracks / 2) * five_time
+ # if track_count < total_tracks:
+ # seconds = dynamic_time(int(time_remain))
+ # if track_count == total_tracks:
+ # seconds = "0s"
+ # second_key = "lavalink_time"
+ await notifier.notify_user(
+ current=track_count,
+ total=total_tracks,
+ key=key,
+ seconds_key=second_key,
+ seconds=seconds,
+ )
+
+ if consecutive_fails >= 10:
+ error_embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("Failing to get tracks, skipping remaining."),
+ )
+ await notifier.update_embed(error_embed)
+ break
+ if not track_object:
+ consecutive_fails += 1
+ continue
+ consecutive_fails = 0
+ single_track = track_object[0]
+ if not await is_allowed(
+ ctx.guild,
+ (
+ f"{single_track.title} {single_track.author} {single_track.uri} "
+ f"{str(dataclasses.Query.process_input(single_track))}"
+ ),
+ ):
+ has_not_allowed = True
+ log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
+ continue
+ track_list.append(single_track)
+ if enqueue:
+ if guild_data["maxlength"] > 0:
+ if track_limit(single_track, guild_data["maxlength"]):
+ enqueued_tracks += 1
+ player.add(ctx.author, single_track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue",
+ player.channel.guild,
+ single_track,
+ ctx.author,
+ )
+ else:
+ enqueued_tracks += 1
+ player.add(ctx.author, single_track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue",
+ player.channel.guild,
+ single_track,
+ ctx.author,
+ )
+
+ if not player.current:
+ await player.play()
+ if len(track_list) == 0:
+ if not has_not_allowed:
+ embed3 = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_(
+ "Nothing found.\nThe YouTube API key may be invalid "
+ "or you may be rate limited on YouTube's search service.\n"
+ "Check the YouTube API key again and follow the instructions "
+ "at `{prefix}audioset youtubeapi`."
+ ).format(prefix=ctx.prefix),
+ )
+ await ctx.send(embed=embed3)
+ player.maybe_shuffle()
+ if enqueue and tracks_from_spotify:
+ if total_tracks > enqueued_tracks:
+ maxlength_msg = " {bad_tracks} tracks cannot be queued.".format(
+ bad_tracks=(total_tracks - enqueued_tracks)
+ )
+ else:
+ maxlength_msg = ""
+
+ embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("Playlist Enqueued"),
+ description=_("Added {num} tracks to the queue.{maxlength_msg}").format(
+ num=enqueued_tracks, maxlength_msg=maxlength_msg
+ ),
+ )
+ if not guild_data["shuffle"] and queue_dur > 0:
+ embed.set_footer(
+ text=_(
+ "{time} until start of playlist"
+ " playback: starts at #{position} in queue"
+ ).format(time=queue_total_duration, position=before_queue_length + 1)
+ )
+
+ await notifier.update_embed(embed)
+ lock(ctx, False)
+
+ if spotify_cache:
+ task = ("insert", ("spotify", database_entries))
+ self.append_task(ctx, *task)
+ except Exception as e:
+ lock(ctx, False)
+ raise e
+ finally:
+ lock(ctx, False)
+ return track_list
+
+ async def youtube_query(self, ctx: commands.Context, track_info: str) -> str:
+ current_cache_level = (
+ CacheLevel(await self.config.cache_level()) if HAS_SQL else CacheLevel.none()
+ )
+ cache_enabled = CacheLevel.set_youtube().is_subset(current_cache_level)
+ val = None
+ if cache_enabled:
+ update = True
+ with contextlib.suppress(SQLError):
+ val, update = await self.fetch_one("youtube", "youtube_url", {"track": track_info})
+ if update:
+ val = None
+ if val is None:
+ youtube_url = await self._youtube_first_time_query(
+ ctx, track_info, current_cache_level=current_cache_level
+ )
+ else:
+ if cache_enabled:
+ task = ("update", ("youtube", {"track": track_info}))
+ self.append_task(ctx, *task)
+ youtube_url = val
+ return youtube_url
+
+ async def lavalink_query(
+ self,
+ ctx: commands.Context,
+ player: lavalink.Player,
+ query: dataclasses.Query,
+ forced: bool = False,
+ ) -> Tuple[LoadResult, bool]:
+ """
+ A replacement for :code:`lavalink.Player.load_tracks`.
+ This will try to get a valid cached entry first if not found or if in valid
+ it will then call the lavalink API.
+
+ Parameters
+ ----------
+ ctx: commands.Context
+ The context this method is being called under.
+ player : lavalink.Player
+ The player who's requesting the query.
+ query: dataclasses.Query
+ The Query object for the query in question.
+ forced:bool
+ Whether or not to skip cache and call API first..
+ Returns
+ -------
+ Tuple[lavalink.LoadResult, bool]
+ Tuple with the Load result and whether or not the API was called.
+ """
+ current_cache_level = (
+ CacheLevel(await self.config.cache_level()) if HAS_SQL else CacheLevel.none()
+ )
+ cache_enabled = CacheLevel.set_lavalink().is_subset(current_cache_level)
+ val = None
+ _raw_query = dataclasses.Query.process_input(query)
+ query = str(_raw_query)
+ if cache_enabled and not forced and not _raw_query.is_local:
+ update = True
+ with contextlib.suppress(SQLError):
+ val, update = await self.fetch_one("lavalink", "data", {"query": query})
+ if update:
+ val = None
+ if val:
+ task = ("update", ("lavalink", {"query": query}))
+ self.append_task(ctx, *task)
+ if val and not forced:
+ data = json.loads(val)
+ data["query"] = query
+ results = LoadResult(data)
+ called_api = False
+ if results.has_error:
+ # If cached value has an invalid entry make a new call so that it gets updated
+ return await self.lavalink_query(ctx, player, _raw_query, forced=True)
+ else:
+ called_api = True
+ results = None
+ try:
+ results = await player.load_tracks(query)
+ except KeyError:
+ results = None
+ if results is None:
+ results = LoadResult({"loadType": "LOAD_FAILED", "playlistInfo": {}, "tracks": []})
+ if (
+ cache_enabled
+ and results.load_type
+ and not results.has_error
+ and not _raw_query.is_local
+ and results.tracks
+ ):
+ with contextlib.suppress(SQLError):
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+ task = (
+ "insert",
+ (
+ "lavalink",
+ [
+ {
+ "query": query,
+ "data": json.dumps(results._raw),
+ "last_updated": time_now,
+ "last_fetched": time_now,
+ }
+ ],
+ ),
+ )
+ self.append_task(ctx, *task)
+ return results, called_api
+
+ async def run_tasks(self, ctx: Optional[commands.Context] = None, _id=None):
+ lock_id = _id or ctx.message.id
+ lock_author = ctx.author if ctx else None
+ async with self._lock:
+ if lock_id in self._tasks:
+ log.debug(f"Running database writes for {lock_id} ({lock_author})")
+ with contextlib.suppress(Exception):
+ tasks = self._tasks[ctx.message.id]
+ del self._tasks[ctx.message.id]
+ await asyncio.gather(
+ *[asyncio.ensure_future(self.insert(*a)) for a in tasks["insert"]],
+ loop=self.bot.loop,
+ return_exceptions=True,
+ )
+ await asyncio.gather(
+ *[asyncio.ensure_future(self.update(*a)) for a in tasks["update"]],
+ loop=self.bot.loop,
+ return_exceptions=True,
+ )
+ log.debug(f"Completed database writes for {lock_id} " f"({lock_author})")
+
+ async def run_all_pending_tasks(self):
+ async with self._lock:
+ log.debug("Running pending writes to database")
+ with contextlib.suppress(Exception):
+ tasks = {"update": [], "insert": []}
+ for k, task in self._tasks.items():
+ for t, args in task.items():
+ tasks[t].append(args)
+ self._tasks = {}
+
+ await asyncio.gather(
+ *[asyncio.ensure_future(self.insert(*a)) for a in tasks["insert"]],
+ loop=self.bot.loop,
+ return_exceptions=True,
+ )
+ await asyncio.gather(
+ *[asyncio.ensure_future(self.update(*a)) for a in tasks["update"]],
+ loop=self.bot.loop,
+ return_exceptions=True,
+ )
+ log.debug("Completed pending writes to database have finished")
+
+ def append_task(self, ctx: commands.Context, event: str, task: tuple, _id=None):
+ lock_id = _id or ctx.message.id
+ if lock_id not in self._tasks:
+ self._tasks[lock_id] = {"update": [], "insert": []}
+ self._tasks[lock_id][event].append(task)
+
+ async def play_random(self):
+ tracks = []
+ try:
+ query_data = {}
+ for i in range(1, 8):
+ date = (
+ "%"
+ + str(
+ (
+ datetime.datetime.now(datetime.timezone.utc)
+ - datetime.timedelta(days=i)
+ ).date()
+ )
+ + "%"
+ )
+ query_data[f"day{i}"] = date
+
+ vals = await self.fetch_all("lavalink", "data", query_data)
+ recently_played = [r.data for r in vals if r]
+
+ if recently_played:
+ track = random.choice(recently_played)
+ results = LoadResult(json.loads(track))
+ tracks = list(results.tracks)
+ except Exception:
+ tracks = []
+
+ return tracks
+
+ async def autoplay(self, player: lavalink.Player):
+ autoplaylist = await self.config.guild(player.channel.guild).autoplaylist()
+ current_cache_level = (
+ CacheLevel(await self.config.cache_level()) if HAS_SQL else CacheLevel.none()
+ )
+ cache_enabled = CacheLevel.set_lavalink().is_subset(current_cache_level)
+ playlist = None
+ tracks = None
+ if autoplaylist["enabled"]:
+ with contextlib.suppress(Exception):
+ playlist = await get_playlist(
+ autoplaylist["id"],
+ autoplaylist["scope"],
+ self.bot,
+ player.channel.guild,
+ player.channel.guild.me,
+ )
+ tracks = playlist.tracks_obj
+
+ if not tracks or not getattr(playlist, "tracks", None):
+ if cache_enabled:
+ tracks = await self.play_random()
+ if not tracks:
+ ctx = namedtuple("Context", "message")
+ results, called_api = await self.lavalink_query(
+ ctx(player.channel.guild), player, dataclasses.Query.process_input(_TOP_100_US)
+ )
+ tracks = list(results.tracks)
+ if tracks:
+ multiple = len(tracks) > 1
+ track = tracks[0]
+
+ valid = not multiple
+
+ while valid is False and multiple:
+ track = random.choice(tracks)
+ query = dataclasses.Query.process_input(track)
+ if not query.valid:
+ continue
+ if query.is_local and not query.track.exists():
+ continue
+ if not await is_allowed(
+ player.channel.guild,
+ (
+ f"{track.title} {track.author} {track.uri} "
+ f"{str(dataclasses.Query.process_input(track))}"
+ ),
+ ):
+ log.debug(
+ "Query is not allowed in "
+ f"{player.channel.guild} ({player.channel.guild.id})"
+ )
+ continue
+ valid = True
+
+ track.extras = {"autoplay": True}
+ player.add(player.channel.guild.me, track)
+ self.bot.dispatch(
+ "red_audio_track_auto_play", player.channel.guild, track, player.channel.guild.me
+ )
+ if not player.current:
+ await player.play()
diff --git a/redbot/cogs/audio/audio.py b/redbot/cogs/audio/audio.py
index 02e3f0f0b..e25cbda83 100644
--- a/redbot/cogs/audio/audio.py
+++ b/redbot/cogs/audio/audio.py
@@ -1,44 +1,70 @@
-import aiohttp
+# -*- coding: utf-8 -*-
import asyncio
-import base64
+import contextlib
import datetime
-import discord
-from fuzzywuzzy import process
import heapq
-from io import StringIO
import json
-import lavalink
import logging
-import math
import os
import random
import re
import time
-from typing import Optional
+import traceback
+from collections import namedtuple
+from io import StringIO
+from typing import List, Optional, Tuple, Union, cast
+
+import aiohttp
+import discord
+import lavalink
+import math
+from fuzzywuzzy import process
+
import redbot.core
-from redbot.core import Config, commands, checks, bank
+from redbot.core import Config, bank, checks, commands
from redbot.core.data_manager import cog_data_path
from redbot.core.i18n import Translator, cog_i18n
-from redbot.core.utils.chat_formatting import bold, box, pagify
+from redbot.core.utils.chat_formatting import bold, box, humanize_number, inline, pagify
from redbot.core.utils.menus import (
- menu,
DEFAULT_CONTROLS,
- prev_page,
- next_page,
close_menu,
+ menu,
+ next_page,
+ prev_page,
start_adding_reactions,
)
from redbot.core.utils.predicates import MessagePredicate, ReactionPredicate
-from urllib.parse import urlparse
+from . import dataclasses
+from .apis import MusicCache, HAS_SQL, _ERROR
+from .checks import can_have_caching
+from .converters import ComplexScopeParser, ScopeParser, get_lazy_converter, get_playlist_converter
+from .equalizer import Equalizer
+from .errors import LavalinkDownloadFailed, MissingGuild, SpotifyFetchError, TooManyMatches
from .manager import ServerManager
+from .playlists import (
+ FakePlaylist,
+ Playlist,
+ PlaylistScope,
+ create_playlist,
+ delete_playlist,
+ get_all_playlist,
+ get_playlist,
+ humanize_scope,
+)
+from .utils import *
+
_ = Translator("Audio", __file__)
-__version__ = "0.0.9"
-__author__ = ["aikaterna"]
+__version__ = "1.0.0"
+__author__ = ["aikaterna", "Draper"]
log = logging.getLogger("red.audio")
+_SCHEMA_VERSION = 2
+LazyGreedyConverter = get_lazy_converter("--")
+PlaylistConverter = get_playlist_converter()
+
@cog_i18n(_)
class Audio(commands.Cog):
@@ -55,8 +81,20 @@ class Audio(commands.Cog):
super().__init__()
self.bot = bot
self.config = Config.get_conf(self, 2711759130, force_registration=True)
-
+ self.skip_votes = {}
+ self.session = aiohttp.ClientSession()
+ self._connect_task = None
+ self._disconnect_task = None
+ self._cleaned_up = False
+ self._connection_aborted = False
+ self.play_lock = {}
+ self._manager: Optional[ServerManager] = None
+ self._cog_name = None
+ self._cog_id = None
default_global = dict(
+ schema_version=1,
+ cache_level=0,
+ cache_age=365,
status=False,
use_external_lavalink=False,
restrict=True,
@@ -66,15 +104,18 @@ class Audio(commands.Cog):
)
default_guild = dict(
+ auto_play=False,
+ autoplaylist=dict(enabled=False, id=None, name=None, scope=None),
disconnect=False,
dj_enabled=False,
dj_role=None,
emptydc_enabled=False,
emptydc_timer=0,
+ emptypause_enabled=False,
+ emptypause_timer=0,
jukebox=False,
jukebox_price=0,
maxlength=0,
- playlists={},
notify=False,
repeat=False,
shuffle=False,
@@ -82,22 +123,49 @@ class Audio(commands.Cog):
volume=100,
vote_enabled=False,
vote_percent=0,
+ room_lock=None,
+ url_keyword_blacklist=[],
+ url_keyword_whitelist=[],
)
-
+ _playlist = dict(id=None, author=None, name=None, playlist_url=None, tracks=[])
+ self.config.init_custom("EQUALIZER", 1)
+ self.config.register_custom("EQUALIZER", eq_bands=[], eq_presets={})
+ self.config.init_custom(PlaylistScope.GLOBAL.value, 1)
+ self.config.register_custom(PlaylistScope.GLOBAL.value, **_playlist)
+ self.config.init_custom(PlaylistScope.GUILD.value, 2)
+ self.config.register_custom(PlaylistScope.GUILD.value, **_playlist)
+ self.config.init_custom(PlaylistScope.USER.value, 2)
+ self.config.register_custom(PlaylistScope.USER.value, **_playlist)
self.config.register_guild(**default_guild)
self.config.register_global(**default_global)
- self.skip_votes = {}
- self.session = aiohttp.ClientSession()
- self._connect_task = None
- self._disconnect_task = None
- self._cleaned_up = False
-
- self.spotify_token = None
+ self.music_cache = MusicCache(bot, self.session, path=str(cog_data_path(raw_name="Audio")))
self.play_lock = {}
self._manager: Optional[ServerManager] = None
+ self.bot.dispatch("red_audio_initialized", self)
- async def cog_before_invoke(self, ctx):
+ @property
+ def owns_autoplay(self):
+ c = self.bot.get_cog(self._cog_name)
+ if c and id(c) == self._cog_id:
+ return c
+
+ @owns_autoplay.setter
+ def owns_autoplay(self, value: commands.Cog):
+ if self.owns_autoplay:
+ raise RuntimeError(
+ f"`{self._cog_name}` already has ownership of autoplay, "
+ f"please unload it if you wish to load `{value.qualified_name}`."
+ )
+ self._cog_name = value.qualified_name
+ self._cog_id = id(value)
+
+ @owns_autoplay.deleter
+ def owns_autoplay(self):
+ self._cog_name = None
+ self._cog_id = None
+
+ async def cog_before_invoke(self, ctx: commands.Context):
if self.llsetup in [ctx.command, ctx.command.root_parent]:
pass
elif self._connect_task.cancelled():
@@ -108,11 +176,84 @@ class Audio(commands.Cog):
raise RuntimeError(
"Not running audio command due to invalid machine architecture for Lavalink."
)
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ dj_role_obj = ctx.guild.get_role(await self.config.guild(ctx.guild).dj_role())
+ if not dj_role_obj:
+ await self.config.guild(ctx.guild).dj_enabled.set(None)
+ await self.config.guild(ctx.guild).dj_role.set(None)
+ await self._embed_msg(ctx, _("No DJ role found. Disabling DJ mode."))
async def initialize(self):
+ pass_config_to_dependencies(self.config, self.bot, await self.config.localpath())
+ await self.music_cache.initialize(self.config)
+ asyncio.ensure_future(
+ self._migrate_config(
+ from_version=await self.config.schema_version(), to_version=_SCHEMA_VERSION
+ )
+ )
self._restart_connect()
self._disconnect_task = self.bot.loop.create_task(self.disconnect_timer())
lavalink.register_event_listener(self.event_handler)
+ if not HAS_SQL:
+ error_message = (
+ "Audio version: {version}\nThis version requires some SQL dependencies to "
+ "access the caching features, "
+ "your Python install is missing some of them.\n\n"
+ "For instructions on how to fix it Google "
+ f"`{_ERROR}`.\n"
+ "You will need to install the missing SQL dependency.\n\n"
+ ).format(version=__version__)
+ with contextlib.suppress(discord.HTTPException):
+ for page in pagify(error_message):
+ await self.bot.send_to_owners(page)
+ log.critical(error_message)
+
+ async def _migrate_config(self, from_version: int, to_version: int):
+ database_entries = []
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+ if from_version == to_version:
+ return
+ elif from_version < to_version:
+ all_guild_data = await self.config.all_guilds()
+ all_playlist = {}
+ for guild_id, guild_data in all_guild_data.items():
+ temp_guild_playlist = guild_data.pop("playlists", None)
+ if temp_guild_playlist:
+ guild_playlist = {}
+ for count, (name, data) in enumerate(temp_guild_playlist.items(), 1):
+ if not data or not name:
+ continue
+ playlist = {"id": count, "name": name, "guild": int(guild_id)}
+ playlist.update(data)
+ guild_playlist[str(count)] = playlist
+
+ tracks_in_playlist = data.get("tracks", []) or []
+ for t in tracks_in_playlist:
+ uri = t.get("info", {}).get("uri")
+ if uri:
+ t = {"loadType": "V2_COMPAT", "tracks": [t], "query": uri}
+ database_entries.append(
+ {
+ "query": uri,
+ "data": json.dumps(t),
+ "last_updated": time_now,
+ "last_fetched": time_now,
+ }
+ )
+ if guild_playlist:
+ all_playlist[str(guild_id)] = guild_playlist
+ await self.config.custom(PlaylistScope.GUILD.value).set(all_playlist)
+ # new schema is now in place
+ await self.config.schema_version.set(_SCHEMA_VERSION)
+
+ # migration done, now let's delete all the old stuff
+ for guild_id in all_guild_data:
+ await self.config.guild(
+ cast(discord.Guild, discord.Object(id=guild_id))
+ ).clear_raw("playlists")
+ if database_entries and HAS_SQL:
+ asyncio.ensure_future(self.music_cache.insert("lavalink", database_entries))
def _restart_connect(self):
if self._connect_task:
@@ -120,8 +261,11 @@ class Audio(commands.Cog):
self._connect_task = self.bot.loop.create_task(self.attempt_connect())
- async def attempt_connect(self, timeout: int = 30):
- while True: # run until success
+ async def attempt_connect(self, timeout: int = 50):
+ self._connection_aborted = False
+ max_retries = 5
+ retry_count = 0
+ while retry_count < max_retries:
external = await self.config.use_external_lavalink()
if external is False:
settings = self._default_lavalink_settings
@@ -134,21 +278,52 @@ class Audio(commands.Cog):
self._manager = ServerManager()
try:
await self._manager.start()
- except RuntimeError as exc:
- log.exception(
- "Exception whilst starting internal Lavalink server, retrying...",
- exc_info=exc,
- )
+ except LavalinkDownloadFailed as exc:
await asyncio.sleep(1)
- continue
+ if exc.should_retry:
+ log.exception(
+ "Exception whilst starting internal Lavalink server, retrying...",
+ exc_info=exc,
+ )
+ retry_count += 1
+ continue
+ else:
+ log.exception(
+ "Fatal exception whilst starting internal Lavalink server, "
+ "aborting...",
+ exc_info=exc,
+ )
+ self._connection_aborted = True
+ raise
except asyncio.CancelledError:
log.exception("Invalid machine architecture, cannot run Lavalink.")
raise
+ except Exception as exc:
+ log.exception(
+ "Unhandled exception whilst starting internal Lavalink server, "
+ "aborting...",
+ exc_info=exc,
+ )
+ self._connection_aborted = True
+ raise
+ else:
+ break
else:
host = await self.config.host()
password = await self.config.password()
rest_port = await self.config.rest_port()
ws_port = await self.config.ws_port()
+ break
+ else:
+ log.critical(
+ "Setting up the Lavalink server failed after multiple attempts. See above "
+ "tracebacks for details."
+ )
+ self._connection_aborted = True
+ return
+
+ retry_count = 0
+ while retry_count < max_retries:
try:
await lavalink.initialize(
bot=self.bot,
@@ -158,26 +333,45 @@ class Audio(commands.Cog):
ws_port=ws_port,
timeout=timeout,
)
- return # break infinite loop
except asyncio.TimeoutError:
log.error("Connecting to Lavalink server timed out, retrying...")
if external is False and self._manager is not None:
await self._manager.shutdown()
+ retry_count += 1
await asyncio.sleep(1) # prevent busylooping
+ except Exception as exc:
+ log.exception(
+ "Unhandled exception whilst connecting to Lavalink, aborting...", exc_info=exc
+ )
+ self._connection_aborted = True
+ raise
+ else:
+ break
+ else:
+ self._connection_aborted = True
+ log.critical(
+ "Connecting to the Lavalink server failed after multiple attempts. See above "
+ "tracebacks for details."
+ )
- async def event_handler(self, player, event_type, extra):
+ async def event_handler(
+ self, player: lavalink.Player, event_type: lavalink.LavalinkEvents, extra
+ ):
disconnect = await self.config.guild(player.channel.guild).disconnect()
+ autoplay = await self.config.guild(player.channel.guild).auto_play() or self.owns_autoplay
notify = await self.config.guild(player.channel.guild).notify()
status = await self.config.status()
+ repeat = await self.config.guild(player.channel.guild).repeat()
async def _players_check():
try:
get_single_title = lavalink.active_players()[0].current.title
+ query = dataclasses.Query.process_input(lavalink.active_players()[0].current.uri)
if get_single_title == "Unknown title":
get_single_title = lavalink.active_players()[0].current.uri
if not get_single_title.startswith("http"):
get_single_title = get_single_title.rsplit("/", 1)[-1]
- elif "localtracks/" in lavalink.active_players()[0].current.uri:
+ elif query.is_local:
get_single_title = "{} - {}".format(
lavalink.active_players()[0].current.author,
lavalink.active_players()[0].current.title,
@@ -209,32 +403,79 @@ class Audio(commands.Cog):
)
if event_type == lavalink.LavalinkEvents.TRACK_START:
+ self.skip_votes[player.channel.guild] = []
playing_song = player.fetch("playing_song")
requester = player.fetch("requester")
player.store("prev_song", playing_song)
player.store("prev_requester", requester)
- player.store("playing_song", player.current.uri)
- player.store("requester", player.current.requester)
- self.skip_votes[player.channel.guild] = []
+ player.store("playing_song", player.current)
+ player.store(
+ "requester", player.current.requester if player.current else player.current
+ )
+ self.bot.dispatch(
+ "red_audio_track_start",
+ player.channel.guild,
+ player.current,
+ player.current.requester,
+ )
+ if event_type == lavalink.LavalinkEvents.TRACK_END:
+ prev_song = player.fetch("prev_song")
+ prev_requester = player.fetch("prev_requester")
+ self.bot.dispatch(
+ "red_audio_track_end", player.channel.guild, prev_song, prev_requester
+ )
+
+ if event_type == lavalink.LavalinkEvents.QUEUE_END:
+ prev_song = player.fetch("prev_song")
+ prev_requester = player.fetch("prev_requester")
+ self.bot.dispatch(
+ "red_audio_queue_end", player.channel.guild, prev_song, prev_requester
+ )
+ if autoplay and not player.queue and player.fetch("playing_song") is not None:
+ if self.owns_autoplay is None:
+ await self.music_cache.autoplay(player)
+ else:
+ self.bot.dispatch(
+ "red_audio_should_auto_play",
+ player,
+ player.channel.guild,
+ player.channel,
+ self.play_query,
+ )
if event_type == lavalink.LavalinkEvents.TRACK_START and notify:
notify_channel = player.fetch("channel")
+ prev_song = player.fetch("prev_song")
if notify_channel:
notify_channel = self.bot.get_channel(notify_channel)
if player.fetch("notify_message") is not None:
- try:
+ with contextlib.suppress(discord.HTTPException):
await player.fetch("notify_message").delete()
- except discord.errors.NotFound:
- pass
- if "localtracks/" in player.current.uri:
- if not player.current.title == "Unknown title":
+
+ if (
+ autoplay
+ and player.current.extras.get("autoplay")
+ and (prev_song is None or not prev_song.extras.get("autoplay"))
+ ):
+ embed = discord.Embed(
+ colour=(await self.bot.get_embed_colour(notify_channel)),
+ title=_("Auto play started."),
+ )
+ await notify_channel.send(embed=embed)
+
+ query = dataclasses.Query.process_input(player.current.uri)
+
+ if query.is_local if player.current else False:
+ if player.current.title != "Unknown title":
description = "**{} - {}**\n{}".format(
player.current.author,
player.current.title,
- player.current.uri.replace("localtracks/", ""),
+ dataclasses.LocalPath(player.current.uri).to_string_hidden(),
)
else:
- description = "{}".format(player.current.uri.replace("localtracks/", ""))
+ description = "{}".format(
+ dataclasses.LocalPath(player.current.uri).to_string_hidden()
+ )
else:
description = "**[{}]({})**".format(player.current.title, player.current.uri)
if player.current.is_stream:
@@ -242,7 +483,7 @@ class Audio(commands.Cog):
else:
dur = lavalink.utils.format_time(player.current.length)
embed = discord.Embed(
- colour=(await self._get_embed_colour(notify_channel)),
+ colour=(await self.bot.get_embed_color(notify_channel)),
title=_("Now Playing"),
description=description,
)
@@ -269,16 +510,18 @@ class Audio(commands.Cog):
player_check = await _players_check()
await _status_check(player_check[1])
- if event_type == lavalink.LavalinkEvents.QUEUE_END and notify:
+ if event_type == lavalink.LavalinkEvents.QUEUE_END and notify and not autoplay:
notify_channel = player.fetch("channel")
if notify_channel:
notify_channel = self.bot.get_channel(notify_channel)
embed = discord.Embed(
- colour=(await self._get_embed_colour(notify_channel)), title=_("Queue ended.")
+ colour=(await self.bot.get_embed_colour(notify_channel)),
+ title=_("Queue ended."),
)
await notify_channel.send(embed=embed)
- if event_type == lavalink.LavalinkEvents.QUEUE_END and disconnect:
+ elif event_type == lavalink.LavalinkEvents.QUEUE_END and disconnect and not autoplay:
+ self.bot.dispatch("red_audio_audio_disconnect", player.channel.guild)
await player.disconnect()
if event_type == lavalink.LavalinkEvents.QUEUE_END and status:
@@ -286,53 +529,439 @@ class Audio(commands.Cog):
await _status_check(player_check[1])
if event_type == lavalink.LavalinkEvents.TRACK_EXCEPTION:
- if "localtracks/" in player.current.uri:
- return
message_channel = player.fetch("channel")
if message_channel:
message_channel = self.bot.get_channel(message_channel)
+ query = dataclasses.Query.process_input(player.current.uri)
+ if player.current and query.is_local:
+ query = dataclasses.Query.process_input(player.current.uri)
+ if player.current.title == "Unknown title":
+ description = "{}".format(query.track.to_string_hidden())
+ else:
+ song = bold("{} - {}").format(player.current.author, player.current.title)
+ description = "{}\n{}".format(song, query.track.to_string_hidden())
+ else:
+ description = bold("[{}]({})").format(player.current.title, player.current.uri)
+
embed = discord.Embed(
- colour=(await self._get_embed_colour(message_channel)),
+ colour=(await self.bot.get_embed_color(message_channel)),
title=_("Track Error"),
- description="{}\n**[{}]({})**".format(
- extra, player.current.title, player.current.uri
- ),
+ description="{}\n{}".format(extra, description),
)
embed.set_footer(text=_("Skipping..."))
await message_channel.send(embed=embed)
- await player.skip()
+ while True:
+ if player.current in player.queue:
+ player.queue.remove(player.current)
+ else:
+ break
+ if repeat:
+ player.current = None
+ await player.skip()
+
+ async def play_query(
+ self,
+ query: str,
+ guild: discord.Guild,
+ channel: discord.VoiceChannel,
+ is_autoplay: bool = True,
+ ):
+ if not self._player_check(guild.me):
+ try:
+ if (
+ not channel.permissions_for(guild.me).connect
+ or not channel.permissions_for(guild.me).move_members
+ and userlimit(channel)
+ ):
+ log.error(f"I don't have permission to connect to {channel} in {guild}.")
+
+ await lavalink.connect(channel)
+ player = lavalink.get_player(guild.id)
+ player.store("connect", datetime.datetime.utcnow())
+ except IndexError:
+ log.debug(
+ f"Connection to Lavalink has not yet been established"
+ f" while trying to connect to to {channel} in {guild}."
+ )
+ return
+
+ player = lavalink.get_player(guild.id)
+
+ player.store("channel", channel.id)
+ player.store("guild", guild.id)
+ await self._data_check(guild.me)
+ query = dataclasses.Query.process_input(query)
+ ctx = namedtuple("Context", "message")
+ results, called_api = await self.music_cache.lavalink_query(ctx(guild), player, query)
+
+ if not results.tracks:
+ log.debug(f"Query returned no tracks.")
+ return
+ track = results.tracks[0]
+
+ if not await is_allowed(
+ guild, f"{track.title} {track.author} {track.uri} {str(query._raw)}"
+ ):
+ log.debug(f"Query is not allowed in {guild} ({guild.id})")
+ return
+ track.extras = {"autoplay": is_autoplay}
+ player.add(player.channel.guild.me, track)
+ self.bot.dispatch(
+ "red_audio_track_auto_play", player.channel.guild, track, player.channel.guild.me
+ )
+ if not player.current:
+ await player.play()
+
+ async def delegate_autoplay(self, cog: commands.Cog = None):
+ """
+ Parameters
+ ----------
+ cog: Optional[commands.Cog]
+ The Cog who is taking ownership of Audio's autoplay.
+ If :code:`None` gives ownership back to Audio
+ """
+ if isinstance(cog, commands.Cog):
+ self.owns_autoplay = cog
+ else:
+ del self.owns_autoplay
@commands.group()
@commands.guild_only()
- async def audioset(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def audioset(self, ctx: commands.Context):
"""Music configuration options."""
pass
@audioset.command()
@checks.mod_or_permissions(manage_messages=True)
- async def dc(self, ctx):
+ async def dc(self, ctx: commands.Context):
"""Toggle the bot auto-disconnecting when done playing.
This setting takes precedence over [p]audioset emptydisconnect.
"""
+
disconnect = await self.config.guild(ctx.guild).disconnect()
- await self.config.guild(ctx.guild).disconnect.set(not disconnect)
- await self._embed_msg(
- ctx,
- _("Auto-disconnection at queue end: {true_or_false}.").format(
- true_or_false=not disconnect
- ),
+ autoplay = await self.config.guild(ctx.guild).auto_play()
+ msg = ""
+ msg += _("Auto-disconnection at queue end: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not disconnect else _("Disabled")
)
+ await self.config.guild(ctx.guild).repeat.set(not disconnect)
+ if disconnect is not True and autoplay is True:
+ msg += _("\nAuto-play has been disabled.")
+ await self.config.guild(ctx.guild).auto_play.set(False)
+
+ await self.config.guild(ctx.guild).disconnect.set(not disconnect)
+
+ embed = discord.Embed(
+ title=_("Auto-disconnection settings changed"),
+ description=msg,
+ colour=await ctx.embed_colour(),
+ )
+ await ctx.send(embed=embed)
+
+ @audioset.group(name="restrictions")
+ @checks.mod_or_permissions(manage_messages=True)
+ async def _perms(self, ctx: commands.Context):
+ """Manages the keyword whitelist and blacklist."""
+ pass
+
+ @_perms.group(name="whitelist")
+ async def _perms_whitelist(self, ctx: commands.Context):
+ """Manages the keyword whitelist."""
+ pass
+
+ @_perms.group(name="blacklist")
+ async def _perms_blacklist(self, ctx: commands.Context):
+ """Manages the keyword blacklist."""
+ pass
+
+ @_perms_blacklist.command(name="add")
+ async def _perms_blacklist_add(self, ctx: commands.Context, *, keyword: str):
+ """Adds a keyword to the blacklist."""
+ keyword = keyword.lower().strip()
+ if not keyword:
+ return await ctx.send_help()
+ exists = False
+ async with self.config.guild(ctx.guild).url_keyword_blacklist() as blacklist:
+ if keyword in blacklist:
+ exists = True
+ else:
+ blacklist.append(keyword)
+ if exists:
+ return await self._embed_msg(ctx, _("Keyword already in the blacklist."))
+ else:
+ embed = discord.Embed(title=_("Blacklist modified"), colour=await ctx.embed_colour())
+ embed.description = _("Added: `{blacklisted}` to the blacklist.").format(
+ blacklisted=keyword
+ )
+ await ctx.send(embed=embed)
+
+ @_perms_whitelist.command(name="add")
+ async def _perms_whitelist_add(self, ctx: commands.Context, *, keyword: str):
+ """Adds a keyword to the whitelist.
+
+ If anything is added to whitelist, it will blacklist everything else.
+ """
+ keyword = keyword.lower().strip()
+ if not keyword:
+ return await ctx.send_help()
+ exists = False
+ async with self.config.guild(ctx.guild).url_keyword_whitelist() as whitelist:
+ if keyword in whitelist:
+ exists = True
+ else:
+ whitelist.append(keyword)
+ if exists:
+ return await self._embed_msg(ctx, _("Keyword already in the whitelist."))
+ else:
+ embed = discord.Embed(title=_("Whitelist modified"), colour=await ctx.embed_colour())
+ embed.description = _("Added: `{whitelisted}` to the whitelist.").format(
+ whitelisted=keyword
+ )
+ await ctx.send(embed=embed)
+
+ @_perms_blacklist.command(name="delete", aliases=["del", "remove"])
+ async def _perms_blacklist_delete(self, ctx: commands.Context, *, keyword: str):
+ """Removes a keyword from the blacklist."""
+ keyword = keyword.lower().strip()
+ if not keyword:
+ return await ctx.send_help()
+ exists = True
+ async with self.config.guild(ctx.guild).url_keyword_blacklist() as blacklist:
+ if keyword not in blacklist:
+ exists = False
+ else:
+ blacklist.remove(keyword)
+ if not exists:
+ return await self._embed_msg(ctx, _("Keyword is not in the blacklist."))
+ else:
+ embed = discord.Embed(title=_("Blacklist modified"), colour=await ctx.embed_colour())
+ embed.description = _("Removed: `{blacklisted}` from the blacklist.").format(
+ blacklisted=keyword
+ )
+ await ctx.send(embed=embed)
+
+ @_perms_whitelist.command(name="delete", aliases=["del", "remove"])
+ async def _perms_whitelist_delete(self, ctx: commands.Context, *, keyword: str):
+ """Removes a keyword from the whitelist."""
+ keyword = keyword.lower().strip()
+ if not keyword:
+ return await ctx.send_help()
+ exists = True
+ async with self.config.guild(ctx.guild).url_keyword_whitelist() as whitelist:
+ if keyword not in whitelist:
+ exists = False
+ else:
+ whitelist.remove(keyword)
+ if not exists:
+ return await self._embed_msg(ctx, _("Keyword already in the whitelist."))
+ else:
+ embed = discord.Embed(title=_("Whitelist modified"), colour=await ctx.embed_colour())
+ embed.description = _("Removed: `{whitelisted}` from the whitelist.").format(
+ whitelisted=keyword
+ )
+ await ctx.send(embed=embed)
+
+ @_perms_whitelist.command(name="list")
+ async def _perms_whitelist_list(self, ctx: commands.Context):
+ """List all keywords added to the whitelist."""
+ whitelist = await self.config.guild(ctx.guild).url_keyword_whitelist()
+ if not whitelist:
+ return await self._embed_msg(ctx, _("Nothing in the whitelist."))
+ whitelist.sort()
+ text = ""
+ total = len(whitelist)
+ pages = []
+ for i, entry in enumerate(whitelist, 1):
+ text += f"{i}. [{entry}]"
+ if i != total:
+ text += "\n"
+ if i % 10 == 0:
+ pages.append(box(text, lang="ini"))
+ text = ""
+ else:
+ pages.append(box(text, lang="ini"))
+ embed_colour = await ctx.embed_colour()
+ pages = list(
+ discord.Embed(title="Whitelist", description=page, colour=embed_colour)
+ for page in pages
+ )
+ await menu(ctx, pages, DEFAULT_CONTROLS)
+
+ @_perms_blacklist.command(name="list")
+ async def _perms_blacklist_list(self, ctx: commands.Context):
+ """List all keywords added to the blacklist."""
+ blacklist = await self.config.guild(ctx.guild).url_keyword_blacklist()
+ if not blacklist:
+ return await self._embed_msg(ctx, _("Nothing in the blacklist."))
+ blacklist.sort()
+ text = ""
+ total = len(blacklist)
+ pages = []
+ for i, entry in enumerate(blacklist, 1):
+ text += f"{i}. [{entry}]"
+ if i != total:
+ text += "\n"
+ if i % 10 == 0:
+ pages.append(box(text, lang="ini"))
+ text = ""
+ else:
+ pages.append(box(text, lang="ini"))
+ embed_colour = await ctx.embed_colour()
+ pages = list(
+ discord.Embed(title="Whitelist", description=page, colour=embed_colour)
+ for page in pages
+ )
+ await menu(ctx, pages, DEFAULT_CONTROLS)
+
+ @_perms_whitelist.command(name="clear")
+ async def _perms_whitelist_clear(self, ctx: commands.Context):
+ """Clear all keywords from the whitelist."""
+ whitelist = await self.config.guild(ctx.guild).url_keyword_whitelist()
+ if not whitelist:
+ return await self._embed_msg(ctx, _("Nothing in the whitelist."))
+ await self.config.guild(ctx.guild).url_keyword_whitelist.clear()
+ return await self._embed_msg(ctx, _("All entries have been removed from the whitelist."))
+
+ @_perms_blacklist.command(name="clear")
+ async def _perms_blacklist_clear(self, ctx: commands.Context):
+ """Clear all keywords added to the blacklist."""
+ blacklist = await self.config.guild(ctx.guild).url_keyword_blacklist()
+ if not blacklist:
+ return await self._embed_msg(ctx, _("Nothing in the blacklist."))
+ await self.config.guild(ctx.guild).url_keyword_blacklist.clear()
+ return await self._embed_msg(ctx, _("All entries have been removed from the blacklist."))
+
+ @audioset.group(name="autoplay")
+ @checks.mod_or_permissions(manage_messages=True)
+ async def _autoplay(self, ctx: commands.Context):
+ """Change auto-play setting."""
+
+ @_autoplay.command(name="toggle")
+ async def _autoplay_toggle(self, ctx: commands.Context):
+ """Toggle auto-play when there no songs in queue."""
+ autoplay = await self.config.guild(ctx.guild).auto_play()
+ repeat = await self.config.guild(ctx.guild).repeat()
+ disconnect = await self.config.guild(ctx.guild).disconnect()
+ msg = _("Auto-play when queue ends: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not autoplay else _("Disabled")
+ )
+ await self.config.guild(ctx.guild).auto_play.set(not autoplay)
+ if autoplay is not True and repeat is True:
+ msg += _("\nRepeat has been disabled.")
+ await self.config.guild(ctx.guild).repeat.set(False)
+ if autoplay is not True and disconnect is True:
+ msg += _("\nAuto-disconnecting at queue end has been disabled.")
+ await self.config.guild(ctx.guild).disconnect.set(False)
+
+ embed = discord.Embed(
+ title=_("Auto-play settings changed"), description=msg, colour=await ctx.embed_colour()
+ )
+ await ctx.send(embed=embed)
+ if self._player_check(ctx):
+ await self._data_check(ctx)
+
+ @_autoplay.command(name="playlist", usage=" [args]")
+ async def __autoplay_playlist(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Set a playlist to auto-play songs from.
+
+ **Usage**:
+ [p]audioset autoplay playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]audioset autoplay MyGuildPlaylist
+ [p]audioset autoplay MyGlobalPlaylist --scope Global
+ [p]audioset autoplay PersonalPlaylist --scope User --author Draper
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+
+ scope, author, guild, specified_user = scope_data
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist").format(arg=playlist_arg)
+ )
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ tracks = playlist.tracks
+ if not tracks:
+ return await self._embed_msg(
+ ctx, _("Playlist {name} has no tracks.").format(name=playlist.name)
+ )
+ playlist_data = dict(enabled=True, id=playlist.id, name=playlist.name, scope=scope)
+ await self.config.guild(ctx.guild).autoplaylist.set(playlist_data)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+ else:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {name} (`{id}`) [**{scope}**] will be used for autoplay.").format(
+ name=playlist.name,
+ id=playlist.id,
+ scope=humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ ),
+ ),
+ )
+
+ @_autoplay.command(name="reset")
+ async def _autoplay_reset(self, ctx: commands.Context):
+ """Resets auto-play to the default playlist."""
+ playlist_data = dict(enabled=False, id=None, name=None, scope=None)
+ await self.config.guild(ctx.guild).autoplaylist.set(playlist_data)
+ return await self._embed_msg(ctx, _("Set auto-play playlist to default value."))
@audioset.command()
@checks.admin_or_permissions(manage_roles=True)
- async def dj(self, ctx):
+ async def dj(self, ctx: commands.Context):
"""Toggle DJ mode.
DJ mode allows users with the DJ role to use audio commands.
"""
- dj_role_id = await self.config.guild(ctx.guild).dj_role()
- if dj_role_id is None:
+ dj_role = ctx.guild.get_role(await self.config.guild(ctx.guild).dj_role())
+ if dj_role is None:
await self._embed_msg(
ctx, _("Please set a role to use with DJ mode. Enter the role name or ID now.")
)
@@ -347,16 +976,19 @@ class Audio(commands.Cog):
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
await self.config.guild(ctx.guild).dj_enabled.set(not dj_enabled)
await self._embed_msg(
- ctx, _("DJ role enabled: {true_or_false}.").format(true_or_false=not dj_enabled)
+ ctx,
+ _("DJ role: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not dj_enabled else _("Disabled")
+ ),
)
@audioset.command()
@checks.mod_or_permissions(administrator=True)
- async def emptydisconnect(self, ctx, seconds: int):
+ async def emptydisconnect(self, ctx: commands.Context, seconds: int):
"""Auto-disconnection after x seconds while stopped. 0 to disable."""
if seconds < 0:
return await self._embed_msg(ctx, _("Can't be less than zero."))
- if seconds < 10 and seconds > 0:
+ if 10 > seconds > 0:
seconds = 10
if seconds == 0:
enabled = False
@@ -366,7 +998,7 @@ class Audio(commands.Cog):
await self._embed_msg(
ctx,
_("Empty disconnect timer set to {num_seconds}.").format(
- num_seconds=self._dynamic_time(seconds)
+ num_seconds=dynamic_time(seconds)
),
)
@@ -375,7 +1007,29 @@ class Audio(commands.Cog):
@audioset.command()
@checks.mod_or_permissions(administrator=True)
- async def jukebox(self, ctx, price: int):
+ async def emptypause(self, ctx: commands.Context, seconds: int):
+ """Auto-pause after x seconds when room is empty. 0 to disable."""
+ if seconds < 0:
+ return await self._embed_msg(ctx, _("Can't be less than zero."))
+ if 10 > seconds > 0:
+ seconds = 10
+ if seconds == 0:
+ enabled = False
+ await self._embed_msg(ctx, _("Empty pause disabled."))
+ else:
+ enabled = True
+ await self._embed_msg(
+ ctx,
+ _("Empty pause timer set to {num_seconds}.").format(
+ num_seconds=dynamic_time(seconds)
+ ),
+ )
+ await self.config.guild(ctx.guild).emptypause_timer.set(seconds)
+ await self.config.guild(ctx.guild).emptypause_enabled.set(enabled)
+
+ @audioset.command()
+ @checks.mod_or_permissions(administrator=True)
+ async def jukebox(self, ctx: commands.Context, price: int):
"""Set a price for queueing tracks for non-mods. 0 to disable."""
if price < 0:
return await self._embed_msg(ctx, _("Can't be less than zero."))
@@ -387,7 +1041,7 @@ class Audio(commands.Cog):
await self._embed_msg(
ctx,
_("Track queueing command price set to {price} {currency}.").format(
- price=price, currency=await bank.get_currency_name(ctx.guild)
+ price=humanize_number(price), currency=await bank.get_currency_name(ctx.guild)
),
)
@@ -396,7 +1050,7 @@ class Audio(commands.Cog):
@audioset.command()
@checks.is_owner()
- async def localpath(self, ctx, local_path=None):
+ async def localpath(self, ctx: commands.Context, *, local_path=None):
"""Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.
Leave the path blank to reset the path to the default, the Audio data directory.
@@ -404,14 +1058,17 @@ class Audio(commands.Cog):
if not local_path:
await self.config.localpath.set(str(cog_data_path(raw_name="Audio")))
+ pass_config_to_dependencies(
+ self.config, self.bot, str(cog_data_path(raw_name="Audio"))
+ )
return await self._embed_msg(
ctx, _("The localtracks path location has been reset to the default location.")
)
info_msg = _(
"This setting is only for bot owners to set a localtracks folder location "
- "if the Lavalink.jar is being ran from outside of the Audio data directory.\n"
- "In the example below, the full path for 'ParentDirectory' must be passed to this command.\n"
+ "In the example below, the full path for 'ParentDirectory' "
+ "must be passed to this command.\n"
"The path must not contain spaces.\n"
"```\n"
"ParentDirectory\n"
@@ -419,12 +1076,12 @@ class Audio(commands.Cog):
" | |__ Awesome Album Name (folder)\n"
" | |__01 Cool Song.mp3\n"
" | |__02 Groovy Song.mp3\n"
- " |\n"
- " |__ Lavalink.jar\n"
- " |__ application.yml\n"
"```\n"
- "The folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\n"
- "Use this command with no path given to reset it to the default, the Audio data directory for this bot.\n"
+ "The folder path given to this command must contain the localtracks folder.\n"
+ "**This folder and files need to be visible to the user where `"
+ "Lavalink.jar` is being run from.**\n"
+ "Use this command with no path given to reset it to the default, "
+ "the Audio data directory for this bot.\n"
"Do you want to continue to set the provided path for local tracks?"
)
info = await ctx.maybe_send_embed(info_msg)
@@ -434,153 +1091,229 @@ class Audio(commands.Cog):
await ctx.bot.wait_for("reaction_add", check=pred)
if not pred.result:
- try:
+ with contextlib.suppress(discord.HTTPException):
await info.delete()
- except discord.errors.Forbidden:
- pass
return
-
- try:
- if os.getcwd() != local_path:
- os.chdir(local_path)
- os.listdir(local_path)
- except OSError:
+ temp = dataclasses.LocalPath(local_path, forced=True)
+ if not temp.exists() or not temp.is_dir():
return await self._embed_msg(
ctx,
_("{local_path} does not seem like a valid path.").format(local_path=local_path),
)
- jar_check = os.path.isfile(local_path + "/Lavalink.jar")
- yml_check = os.path.isfile(local_path + "/application.yml")
-
- if not jar_check and not yml_check:
- filelist = "a Lavalink.jar and an application.yml"
- elif jar_check and not yml_check:
- filelist = "an application.yml"
- elif not jar_check and yml_check:
- filelist = "a Lavalink.jar"
- else:
- filelist = None
- if filelist is not None:
+ if not temp.localtrack_folder.exists():
warn_msg = _(
- "The path that was entered does not have {filelist} file in "
- "that location. The path will still be saved, but please check the path and "
- "the file location before attempting to play local tracks or start your "
- "Lavalink.jar."
- ).format(filelist=filelist)
- await self._embed_msg(ctx, warn_msg)
-
+ "`{localtracks}` does not exist. "
+ "The path will still be saved, but please check the path and "
+ "create a localtracks folder in `{localfolder}` before attempting "
+ "to play local tracks."
+ ).format(localfolder=temp.absolute(), localtracks=temp.localtrack_folder.absolute())
+ await ctx.send(
+ embed=discord.Embed(
+ title=_("Incorrect environment."),
+ description=warn_msg,
+ colour=await ctx.embed_colour(),
+ )
+ )
+ local_path = str(temp.localtrack_folder.absolute())
await self.config.localpath.set(local_path)
+ pass_config_to_dependencies(self.config, self.bot, local_path)
await self._embed_msg(
ctx, _("Localtracks path set to: {local_path}.").format(local_path=local_path)
)
@audioset.command()
@checks.mod_or_permissions(administrator=True)
- async def maxlength(self, ctx, seconds):
+ async def maxlength(self, ctx: commands.Context, seconds: Union[int, str]):
"""Max length of a track to queue in seconds. 0 to disable.
Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).
Invalid input will turn the max length setting off."""
if not isinstance(seconds, int):
- seconds = int(await self._time_convert(seconds) / 1000)
+ seconds = time_convert(seconds)
if seconds < 0:
return await self._embed_msg(ctx, _("Can't be less than zero."))
if seconds == 0:
await self._embed_msg(ctx, _("Track max length disabled."))
else:
await self._embed_msg(
- ctx,
- _("Track max length set to {seconds}.").format(
- seconds=self._dynamic_time(seconds)
- ),
+ ctx, _("Track max length set to {seconds}.").format(seconds=dynamic_time(seconds))
)
await self.config.guild(ctx.guild).maxlength.set(seconds)
@audioset.command()
@checks.mod_or_permissions(manage_messages=True)
- async def notify(self, ctx):
+ async def notify(self, ctx: commands.Context):
"""Toggle track announcement and other bot messages."""
notify = await self.config.guild(ctx.guild).notify()
await self.config.guild(ctx.guild).notify.set(not notify)
await self._embed_msg(
- ctx, _("Verbose mode on: {true_or_false}.").format(true_or_false=not notify)
+ ctx,
+ _("Verbose mode: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not notify else _("Disabled")
+ ),
)
@audioset.command()
@checks.is_owner()
- async def restrict(self, ctx):
+ async def restrict(self, ctx: commands.Context):
"""Toggle the domain restriction on Audio.
When toggled off, users will be able to play songs from non-commercial websites and links.
- When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."""
+ When toggled on, users are restricted to YouTube, SoundCloud,
+ Mixer, Vimeo, Twitch, and Bandcamp links."""
restrict = await self.config.restrict()
await self.config.restrict.set(not restrict)
await self._embed_msg(
- ctx, _("Commercial links only: {true_or_false}.").format(true_or_false=not restrict)
+ ctx,
+ _("Commercial links only: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not restrict else _("Disabled")
+ ),
)
@audioset.command()
@checks.admin_or_permissions(manage_roles=True)
- async def role(self, ctx, role_name: discord.Role):
+ async def role(self, ctx: commands.Context, role_name: discord.Role):
"""Set the role to use for DJ mode."""
await self.config.guild(ctx.guild).dj_role.set(role_name.id)
dj_role_obj = ctx.guild.get_role(await self.config.guild(ctx.guild).dj_role())
await self._embed_msg(ctx, _("DJ role set to: {role.name}.").format(role=dj_role_obj))
@audioset.command()
- async def settings(self, ctx):
+ async def settings(self, ctx: commands.Context):
"""Show the current settings."""
- is_owner = ctx.author.id == self.bot.owner_id
- data = await self.config.guild(ctx.guild).all()
+ is_owner = await ctx.bot.is_owner(ctx.author)
global_data = await self.config.all()
+ data = await self.config.guild(ctx.guild).all()
dj_role_obj = ctx.guild.get_role(data["dj_role"])
dj_enabled = data["dj_enabled"]
emptydc_enabled = data["emptydc_enabled"]
emptydc_timer = data["emptydc_timer"]
+ emptypause_enabled = data["emptypause_enabled"]
+ emptypause_timer = data["emptypause_timer"]
jukebox = data["jukebox"]
jukebox_price = data["jukebox_price"]
thumbnail = data["thumbnail"]
dc = data["disconnect"]
- jarbuild = redbot.core.__version__
+ autoplay = data["auto_play"]
maxlength = data["maxlength"]
vote_percent = data["vote_percent"]
- msg = "----" + _("Server Settings") + "---- \n"
- if dc:
- msg += _("Auto-disconnect: [{dc}]\n").format(dc=dc)
+ current_level = CacheLevel(global_data["cache_level"])
+ song_repeat = _("Enabled") if data["repeat"] else _("Disabled")
+ song_shuffle = _("Enabled") if data["shuffle"] else _("Disabled")
+ song_notify = _("Enabled") if data["notify"] else _("Disabled")
+ song_status = _("Enabled") if global_data["status"] else _("Disabled")
+ spotify_cache = CacheLevel.set_spotify()
+ youtube_cache = CacheLevel.set_youtube()
+ lavalink_cache = CacheLevel.set_lavalink()
+ has_spotify_cache = current_level.is_superset(spotify_cache)
+ has_youtube_cache = current_level.is_superset(youtube_cache)
+ has_lavalink_cache = current_level.is_superset(lavalink_cache)
+ autoplaylist = data["autoplaylist"]
+ vote_enabled = data["vote_enabled"]
+ msg = "----" + _("Server Settings") + "---- \n"
+ msg += _("Auto-disconnect: [{dc}]\n").format(dc=_("Enabled") if dc else _("Disabled"))
+ msg += _("Auto-play: [{autoplay}]\n").format(
+ autoplay=_("Enabled") if autoplay else _("Disabled")
+ )
if emptydc_enabled:
msg += _("Disconnect timer: [{num_seconds}]\n").format(
- num_seconds=self._dynamic_time(emptydc_timer)
+ num_seconds=dynamic_time(emptydc_timer)
)
- if dj_enabled:
+ if emptypause_enabled:
+ msg += _("Auto Pause timer: [{num_seconds}]\n").format(
+ num_seconds=dynamic_time(emptypause_timer)
+ )
+ if dj_enabled and dj_role_obj:
msg += _("DJ Role: [{role.name}]\n").format(role=dj_role_obj)
if jukebox:
msg += _("Jukebox: [{jukebox_name}]\n").format(jukebox_name=jukebox)
- msg += _("Command price: [{jukebox_price}]\n").format(jukebox_price=jukebox_price)
+ msg += _("Command price: [{jukebox_price}]\n").format(
+ jukebox_price=humanize_number(jukebox_price)
+ )
if maxlength > 0:
msg += _("Max track length: [{tracklength}]\n").format(
- tracklength=self._dynamic_time(maxlength)
+ tracklength=dynamic_time(maxlength)
)
msg += _(
"Repeat: [{repeat}]\n"
"Shuffle: [{shuffle}]\n"
"Song notify msgs: [{notify}]\n"
"Songs as status: [{status}]\n"
- ).format(**global_data, **data)
+ ).format(repeat=song_repeat, shuffle=song_shuffle, notify=song_notify, status=song_status)
if thumbnail:
- msg += _("Thumbnails: [{0}]\n").format(thumbnail)
+ msg += _("Thumbnails: [{0}]\n").format(
+ _("Enabled") if thumbnail else _("Disabled")
+ )
if vote_percent > 0:
msg += _(
"Vote skip: [{vote_enabled}]\nSkip percentage: [{vote_percent}%]\n"
- ).format(**data)
+ ).format(
+ vote_percent=vote_percent,
+ vote_enabled=_("Enabled") if vote_enabled else _("Disabled"),
+ )
+
+ if self.owns_autoplay is not None:
+ msg += (
+ "\n---"
+ + _("Auto-play Settings")
+ + "--- \n"
+ + _("Owning Cog: [{name}]\n").format(name=self._cog_name)
+ )
+ elif autoplay or autoplaylist["enabled"]:
+ if autoplaylist["enabled"]:
+ pname = autoplaylist["name"]
+ pid = autoplaylist["id"]
+ pscope = autoplaylist["scope"]
+ if pscope == PlaylistScope.GUILD.value:
+ pscope = f"Server"
+ elif pscope == PlaylistScope.USER.value:
+ pscope = f"User"
+ else:
+ pscope = "Global"
+ else:
+ pname = _("Cached")
+ pid = _("Cached")
+ pscope = _("Cached")
+ msg += (
+ "\n---"
+ + _("Auto-play Settings")
+ + "--- \n"
+ + _("Playlist name: [{pname}]\n")
+ + _("Playlist ID: [{pid}]\n")
+ + _("Playlist scope: [{pscope}]\n")
+ ).format(pname=pname, pid=pid, pscope=pscope)
+
+ if is_owner:
+ msg += (
+ "\n---"
+ + _("Cache Settings")
+ + "--- \n"
+ + _("Max age: [{max_age}]\n")
+ + _("Spotify cache: [{spotify_status}]\n")
+ + _("Youtube cache: [{youtube_status}]\n")
+ + _("Lavalink cache: [{lavalink_status}]\n")
+ ).format(
+ max_age=str(await self.config.cache_age()) + " " + _("days"),
+ spotify_status=_("Enabled") if has_spotify_cache else _("Disabled"),
+ youtube_status=_("Enabled") if has_youtube_cache else _("Disabled"),
+ lavalink_status=_("Enabled") if has_lavalink_cache else _("Disabled"),
+ )
+
msg += _(
- "---Lavalink Settings--- \n"
+ "\n---" + _("Lavalink Settings") + "--- \n"
"Cog version: [{version}]\n"
- "Jar build: [{jarbuild}]\n"
+ "Red-Lavalink: [{redlava}]\n"
"External server: [{use_external_lavalink}]\n"
- ).format(version=__version__, jarbuild=jarbuild, **global_data)
+ ).format(
+ version=__version__,
+ redlava=lavalink.__version__,
+ use_external_lavalink=_("Enabled")
+ if global_data["use_external_lavalink"]
+ else _("Disabled"),
+ )
if is_owner:
msg += _("Localtracks path: [{localpath}]\n").format(**global_data)
@@ -589,44 +1322,50 @@ class Audio(commands.Cog):
@audioset.command()
@checks.is_owner()
- async def spotifyapi(self, ctx):
+ async def spotifyapi(self, ctx: commands.Context):
"""Instructions to set the Spotify API tokens."""
message = _(
- f"1. Go to Spotify developers and log in with your Spotify account\n"
+ "1. Go to Spotify developers and log in with your Spotify account.\n"
"(https://developer.spotify.com/dashboard/applications)\n"
- '2. Click "Create An App"\n'
+ '2. Click "Create An App".\n'
"3. Fill out the form provided with your app name, etc.\n"
- '4. When asked if you\'re developing commercial integration select "No"\n'
+ '4. When asked if you\'re developing commercial integration select "No".\n'
"5. Accept the terms and conditions.\n"
"6. Copy your client ID and your client secret into:\n"
- "`{prefix}set api spotify client_id,your_client_id "
- "client_secret,your_client_secret`"
+ "`{prefix}set api spotify client_id "
+ "client_secret `"
).format(prefix=ctx.prefix)
await ctx.maybe_send_embed(message)
@checks.is_owner()
@audioset.command()
- async def status(self, ctx):
+ async def status(self, ctx: commands.Context):
"""Enable/disable tracks' titles as status."""
status = await self.config.status()
await self.config.status.set(not status)
await self._embed_msg(
- ctx, _("Song titles as status: {true_or_false}.").format(true_or_false=not status)
+ ctx,
+ _("Song titles as status: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not status else _("Disabled")
+ ),
)
@audioset.command()
@checks.mod_or_permissions(administrator=True)
- async def thumbnail(self, ctx):
+ async def thumbnail(self, ctx: commands.Context):
"""Toggle displaying a thumbnail on audio messages."""
thumbnail = await self.config.guild(ctx.guild).thumbnail()
await self.config.guild(ctx.guild).thumbnail.set(not thumbnail)
await self._embed_msg(
- ctx, _("Thumbnail display: {true_or_false}.").format(true_or_false=not thumbnail)
+ ctx,
+ _("Thumbnail display: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not thumbnail else _("Disabled")
+ ),
)
@audioset.command()
@checks.mod_or_permissions(administrator=True)
- async def vote(self, ctx, percent: int):
+ async def vote(self, ctx: commands.Context, percent: int):
"""Percentage needed for non-mods to skip tracks. 0 to disable."""
if percent < 0:
return await self._embed_msg(ctx, _("Can't be less than zero."))
@@ -648,39 +1387,159 @@ class Audio(commands.Cog):
@audioset.command()
@checks.is_owner()
- async def youtubeapi(self, ctx):
+ async def youtubeapi(self, ctx: commands.Context):
"""Instructions to set the YouTube API key."""
message = _(
f"1. Go to Google Developers Console and log in with your Google account.\n"
"(https://console.developers.google.com/)\n"
"2. You should be prompted to create a new project (name does not matter).\n"
"3. Click on Enable APIs and Services at the top.\n"
- "4. In the list of APIs choose or search for YouTube Data API v3 and click on it. Choose Enable.\n"
+ "4. In the list of APIs choose or search for YouTube Data API v3 and "
+ "click on it. Choose Enable.\n"
"5. Click on Credentials on the left navigation bar.\n"
"6. Click on Create Credential at the top.\n"
'7. At the top click the link for "API key".\n'
"8. No application restrictions are needed. Click Create at the bottom.\n"
- "9. You now have a key to add to `{prefix}set api youtube api_key,your_api_key`"
+ "9. You now have a key to add to `{prefix}set api youtube api_key `"
).format(prefix=ctx.prefix)
await ctx.maybe_send_embed(message)
+ @audioset.command(name="cache", usage="level=[5, 3, 2, 1, 0, -1, -2, -3]")
+ @checks.is_owner()
+ @can_have_caching()
+ async def _storage(self, ctx: commands.Context, *, level: int = None):
+ """Sets the caching level.
+
+ Level can be one of the following:
+
+ 0: Disables all caching
+ 1: Enables Spotify Cache
+ 2: Enables YouTube Cache
+ 3: Enables Lavalink Cache
+ 5: Enables all Caches
+
+ If you wish to disable a specific cache use a negative number.
+
+ """
+ current_level = CacheLevel(await self.config.cache_level())
+ spotify_cache = CacheLevel.set_spotify()
+ youtube_cache = CacheLevel.set_youtube()
+ lavalink_cache = CacheLevel.set_lavalink()
+ has_spotify_cache = current_level.is_superset(spotify_cache)
+ has_youtube_cache = current_level.is_superset(youtube_cache)
+ has_lavalink_cache = current_level.is_superset(lavalink_cache)
+
+ if level is None:
+ msg = (
+ "---"
+ + _("Cache Settings")
+ + "--- \n"
+ + _("Max age: [{max_age}]\n")
+ + _("Spotify cache: [{spotify_status}]\n")
+ + _("Youtube cache: [{youtube_status}]\n")
+ + _("Lavalink cache: [{lavalink_status}]\n")
+ ).format(
+ max_age=str(await self.config.cache_age()) + " " + _("days"),
+ spotify_status=_("Enabled") if has_spotify_cache else _("Disabled"),
+ youtube_status=_("Enabled") if has_youtube_cache else _("Disabled"),
+ lavalink_status=_("Enabled") if has_lavalink_cache else _("Disabled"),
+ )
+ await ctx.send(
+ embed=discord.Embed(
+ colour=await ctx.embed_colour(), description=box(msg, lang="ini")
+ )
+ )
+ return await ctx.send_help()
+ if level not in [5, 3, 2, 1, 0, -1, -2, -3]:
+ return await ctx.send_help()
+
+ removing = level < 0
+
+ if level == 5:
+ newcache = CacheLevel.all()
+ elif level == 0:
+ newcache = CacheLevel.none()
+ elif level in [-3, 3]:
+ if removing:
+ newcache = current_level - lavalink_cache
+ else:
+ newcache = current_level + lavalink_cache
+ elif level in [-2, 2]:
+ if removing:
+ newcache = current_level - youtube_cache
+ else:
+ newcache = current_level + youtube_cache
+ elif level in [-1, 1]:
+ if removing:
+ newcache = current_level - spotify_cache
+ else:
+ newcache = current_level + spotify_cache
+ else:
+ return await ctx.send_help()
+
+ has_spotify_cache = newcache.is_superset(spotify_cache)
+ has_youtube_cache = newcache.is_superset(youtube_cache)
+ has_lavalink_cache = newcache.is_superset(lavalink_cache)
+ msg = (
+ "---"
+ + _("Cache Settings")
+ + "--- \n"
+ + _("Max age: [{max_age}]\n")
+ + _("Spotify cache: [{spotify_status}]\n")
+ + _("Youtube cache: [{youtube_status}]\n")
+ + _("Lavalink cache: [{lavalink_status}]\n")
+ ).format(
+ max_age=str(await self.config.cache_age()) + " " + _("days"),
+ spotify_status=_("Enabled") if has_spotify_cache else _("Disabled"),
+ youtube_status=_("Enabled") if has_youtube_cache else _("Disabled"),
+ lavalink_status=_("Enabled") if has_lavalink_cache else _("Disabled"),
+ )
+ await ctx.send(
+ embed=discord.Embed(colour=await ctx.embed_colour(), description=box(msg, lang="ini"))
+ )
+
+ await self.config.cache_level.set(newcache.value)
+
+ @audioset.command(name="cacheage")
+ @checks.is_owner()
+ @can_have_caching()
+ async def _cacheage(self, ctx: commands.Context, age: int):
+ """Sets the cache max age.
+
+ This commands allows you to set the max number of days
+ before an entry in the cache becomes invalid.
+ """
+ msg = ""
+ if age < 7:
+ msg = _(
+ "Cache age cannot be less than 7 days. If you wish to disable it run "
+ "{prefix}audioset cache.\n"
+ ).format(prefix=ctx.prefix)
+ age = 7
+ msg += _("I've set the cache age to {age} days").format(age=age)
+ await self.config.cache_age.set(age)
+ await self._embed_msg(ctx, msg)
+
@commands.command()
@commands.guild_only()
- async def audiostats(self, ctx):
+ @commands.bot_has_permissions(embed_links=True, add_reactions=True)
+ async def audiostats(self, ctx: commands.Context):
"""Audio stats."""
server_num = len(lavalink.active_players())
total_num = len(lavalink.all_players())
+ localtracks = await self.config.localpath()
msg = ""
for p in lavalink.all_players():
connect_start = p.fetch("connect")
- connect_dur = self._dynamic_time(
+ connect_dur = dynamic_time(
int((datetime.datetime.utcnow() - connect_start).total_seconds())
)
try:
- if "localtracks/" in p.current.uri:
+ query = dataclasses.Query.process_input(p.current.uri)
+ if query.is_local:
if p.current.title == "Unknown title":
- current_title = p.current.uri.replace("localtracks/", "")
+ current_title = localtracks.LocalPath(p.current.uri).to_string_hidden()
msg += "{} [`{}`]: **{}**\n".format(
p.channel.guild.name, connect_dur, current_title
)
@@ -706,11 +1565,15 @@ class Audio(commands.Cog):
em = discord.Embed(
colour=await ctx.embed_colour(),
title=_("Playing in {num}/{total} servers:").format(
- num=server_num, total=total_num
+ num=humanize_number(server_num), total=humanize_number(total_num)
),
description=page,
)
- em.set_footer(text="Page {}/{}".format(pages, (math.ceil(len(msg) / 1500))))
+ em.set_footer(
+ text="Page {}/{}".format(
+ humanize_number(pages), humanize_number((math.ceil(len(msg) / 1500)))
+ )
+ )
pages += 1
servers_embed.append(em)
@@ -718,7 +1581,8 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def bump(self, ctx, index: int):
+ @commands.bot_has_permissions(embed_links=True)
+ async def bump(self, ctx: commands.Context, index: int):
"""Bump a track number to the top of the queue."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx):
@@ -742,23 +1606,36 @@ class Audio(commands.Cog):
bump_song = player.queue[bump_index]
player.queue.insert(0, bump_song)
removed = player.queue.pop(index)
- if "localtracks/" in removed.uri:
- if removed.title == "Unknown title":
- removed_title = removed.uri.replace("localtracks/", "")
+ query = dataclasses.Query.process_input(removed.uri)
+ if query.is_local:
+ localtrack = dataclasses.LocalPath(removed.uri)
+ if removed.title != "Unknown title":
+ description = "**{} - {}**\n{}".format(
+ removed.author, removed.title, localtrack.to_string_hidden()
+ )
else:
- removed_title = "{} - {}".format(removed.author, removed.title)
+ description = localtrack.to_string_hidden()
else:
- removed_title = removed.title
- await self._embed_msg(
- ctx, _("Moved {track} to the top of the queue.").format(track=removed_title)
+ description = "**[{}]({})**".format(removed.title, removed.uri)
+ await ctx.send(
+ embed=discord.Embed(
+ title=_("Moved track to the top of the queue."),
+ colour=await ctx.embed_colour(),
+ description=description,
+ )
)
@commands.command()
@commands.guild_only()
- async def disconnect(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def disconnect(self, ctx: commands.Context):
"""Disconnect from the voice channel."""
- dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
- if self._player_check(ctx):
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("Nothing playing."))
+ else:
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ player = lavalink.get_player(ctx.guild.id)
+
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, _("You need the DJ role to disconnect."))
@@ -767,46 +1644,383 @@ class Audio(commands.Cog):
):
return await self._embed_msg(ctx, _("There are other people listening to music."))
else:
+ await self._embed_msg(ctx, _("Disconnecting..."))
+ self.bot.dispatch("red_audio_audio_disconnect", ctx.guild)
self._play_lock(ctx, False)
- await lavalink.get_player(ctx.guild.id).stop()
- await lavalink.get_player(ctx.guild.id).disconnect()
+ eq = player.fetch("eq")
+ player.queue = []
+ player.store("playing_song", None)
+ if eq:
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
+ await player.stop()
+ await player.disconnect()
+
+ @commands.group(invoke_without_command=True)
+ @commands.guild_only()
+ @commands.cooldown(1, 15, commands.BucketType.guild)
+ @commands.bot_has_permissions(embed_links=True, add_reactions=True)
+ async def eq(self, ctx: commands.Context):
+ """Equalizer management."""
+ if not self._player_check(ctx):
+ ctx.command.reset_cooldown(ctx)
+ return await self._embed_msg(ctx, _("Nothing playing."))
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ player = lavalink.get_player(ctx.guild.id)
+ eq = player.fetch("eq", Equalizer())
+ reactions = ["◀", "⬅", "⏫", "🔼", "🔽", "⏬", "➡", "▶", "⏺", "ℹ"]
+ await self._eq_msg_clear(player.fetch("eq_message"))
+ eq_message = await ctx.send(box(eq.visualise(), lang="ini"))
+
+ if dj_enabled and not await self._can_instaskip(ctx, ctx.author):
+ try:
+ await eq_message.add_reaction("ℹ")
+ except discord.errors.NotFound:
+ pass
+ else:
+ start_adding_reactions(eq_message, reactions, self.bot.loop)
+
+ eq_msg_with_reacts = await ctx.fetch_message(eq_message.id)
+ player.store("eq_message", eq_msg_with_reacts)
+ await self._eq_interact(ctx, player, eq, eq_msg_with_reacts, 0)
+
+ @eq.command(name="delete", aliases=["del", "remove"])
+ async def _eq_delete(self, ctx: commands.Context, eq_preset: str):
+ """Delete a saved eq preset."""
+ async with self.config.custom("EQUALIZER", ctx.guild.id).eq_presets() as eq_presets:
+ eq_preset = eq_preset.lower()
+ try:
+ if eq_presets[eq_preset][
+ "author"
+ ] != ctx.author.id and not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You are not the author of that preset setting.")
+ )
+ del eq_presets[eq_preset]
+ except KeyError:
+ return await self._embed_msg(
+ ctx,
+ _(
+ "{eq_preset} is not in the eq preset list.".format(
+ eq_preset=eq_preset.capitalize()
+ )
+ ),
+ )
+ except TypeError:
+ if await self._can_instaskip(ctx, ctx.author):
+ del eq_presets[eq_preset]
+ else:
+ return await self._embed_msg(
+ ctx, _("You are not the author of that preset setting.")
+ )
+
+ await self._embed_msg(
+ ctx, _("The {preset_name} preset was deleted.".format(preset_name=eq_preset))
+ )
+
+ @eq.command(name="list")
+ async def _eq_list(self, ctx: commands.Context):
+ """List saved eq presets."""
+ eq_presets = await self.config.custom("EQUALIZER", ctx.guild.id).eq_presets()
+ if not eq_presets.keys():
+ return await self._embed_msg(ctx, _("No saved equalizer presets."))
+
+ space = "\N{EN SPACE}"
+ header_name = _("Preset Name")
+ header_author = _("Author")
+ header = box(
+ "[{header_name}]{space}[{header_author}]\n".format(
+ header_name=header_name, space=space * 9, header_author=header_author
+ ),
+ lang="ini",
+ )
+ preset_list = ""
+ for preset, bands in eq_presets.items():
+ try:
+ author = self.bot.get_user(bands["author"])
+ except TypeError:
+ author = "None"
+ msg = f"{preset}{space * (22 - len(preset))}{author}\n"
+ preset_list += msg
+
+ page_list = []
+ for page in pagify(preset_list, delims=[", "], page_length=1000):
+ formatted_page = box(page, lang="ini")
+ embed = discord.Embed(
+ colour=await ctx.embed_colour(), description=f"{header}\n{formatted_page}"
+ )
+ embed.set_footer(
+ text=_("{num} preset(s)").format(num=humanize_number(len(list(eq_presets.keys()))))
+ )
+ page_list.append(embed)
+ if len(page_list) == 1:
+ return await ctx.send(embed=page_list[0])
+ await menu(ctx, page_list, DEFAULT_CONTROLS)
+
+ @eq.command(name="load")
+ async def _eq_load(self, ctx: commands.Context, eq_preset: str):
+ """Load a saved eq preset."""
+ eq_preset = eq_preset.lower()
+ eq_presets = await self.config.custom("EQUALIZER", ctx.guild.id).eq_presets()
+ try:
+ eq_values = eq_presets[eq_preset]["bands"]
+ except KeyError:
+ return await self._embed_msg(
+ ctx, _("No preset named {eq_preset}.".format(eq_preset=eq_preset))
+ )
+ except TypeError:
+ eq_values = eq_presets[eq_preset]
+
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("Nothing playing."))
+
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ player = lavalink.get_player(ctx.guild.id)
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You need the DJ role to load equalizer presets.")
+ )
+
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq_values)
+ await self._eq_check(ctx, player)
+ eq = player.fetch("eq", Equalizer())
+ await self._eq_msg_clear(player.fetch("eq_message"))
+ message = await ctx.send(
+ content=box(eq.visualise(), lang="ini"),
+ embed=discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("The {eq_preset} preset was loaded.".format(eq_preset=eq_preset)),
+ ),
+ )
+ player.store("eq_message", message)
+
+ @eq.command(name="reset")
+ async def _eq_reset(self, ctx: commands.Context):
+ """Reset the eq to 0 across all bands."""
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("Nothing playing."))
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You need the DJ role to reset the equalizer.")
+ )
+ player = lavalink.get_player(ctx.guild.id)
+ eq = player.fetch("eq", Equalizer())
+
+ for band in range(eq._band_count):
+ eq.set_gain(band, 0.0)
+
+ await self._apply_gains(ctx.guild.id, eq.bands)
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
+ player.store("eq", eq)
+ await self._eq_msg_clear(player.fetch("eq_message"))
+ message = await ctx.send(
+ content=box(eq.visualise(), lang="ini"),
+ embed=discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Equalizer values have been reset.")
+ ),
+ )
+ player.store("eq_message", message)
+
+ @eq.command(name="save")
+ @commands.cooldown(1, 15, commands.BucketType.guild)
+ async def _eq_save(self, ctx: commands.Context, eq_preset: str = None):
+ """Save the current eq settings to a preset."""
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("Nothing playing."))
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You need the DJ role to save equalizer presets.")
+ )
+ if not eq_preset:
+ await self._embed_msg(ctx, _("Please enter a name for this equalizer preset."))
+ try:
+ eq_name_msg = await ctx.bot.wait_for(
+ "message",
+ timeout=15.0,
+ check=MessagePredicate.regex(fr"^(?!{re.escape(ctx.prefix)})", ctx),
+ )
+ eq_preset = eq_name_msg.content.split(" ")[0].strip('"').lower()
+ except asyncio.TimeoutError:
+ return await self._embed_msg(
+ ctx, _("No equalizer preset name entered, try the command again later.")
+ )
+
+ eq_exists_msg = None
+ eq_preset = eq_preset.lower().lstrip(ctx.prefix)
+ eq_presets = await self.config.custom("EQUALIZER", ctx.guild.id).eq_presets()
+ eq_list = list(eq_presets.keys())
+
+ if len(eq_preset) > 20:
+ return await self._embed_msg(ctx, _("Try the command again with a shorter name."))
+ if eq_preset in eq_list:
+ embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("Preset name already exists, do you want to replace it?"),
+ )
+ eq_exists_msg = await ctx.send(embed=embed)
+ start_adding_reactions(eq_exists_msg, ReactionPredicate.YES_OR_NO_EMOJIS)
+ pred = ReactionPredicate.yes_or_no(eq_exists_msg, ctx.author)
+ await ctx.bot.wait_for("reaction_add", check=pred)
+ if not pred.result:
+ await self._clear_react(eq_exists_msg)
+ embed2 = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Not saving preset.")
+ )
+ return await eq_exists_msg.edit(embed=embed2)
+
+ player = lavalink.get_player(ctx.guild.id)
+ eq = player.fetch("eq", Equalizer())
+ to_append = {eq_preset: {"author": ctx.author.id, "bands": eq.bands}}
+ new_eq_presets = {**eq_presets, **to_append}
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_presets.set(new_eq_presets)
+ embed3 = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_(
+ "Current equalizer saved to the {preset_name} preset.".format(
+ preset_name=eq_preset
+ )
+ ),
+ )
+ if eq_exists_msg:
+ await self._clear_react(eq_exists_msg)
+ await eq_exists_msg.edit(embed=embed3)
+ else:
+ await ctx.send(embed=embed3)
+
+ @eq.command(name="set")
+ async def _eq_set(self, ctx: commands.Context, band_name_or_position, band_value: float):
+ """Set an eq band with a band number or name and value.
+
+ Band positions are 1-15 and values have a range of -0.25 to 1.0.
+ Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k,
+ 6.3k, 10k, and 16k Hz.
+ Setting a band value to -0.25 nullifies it while +0.25 is double.
+ """
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("Nothing playing."))
+
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You need the DJ role to set equalizer presets.")
+ )
+
+ player = lavalink.get_player(ctx.guild.id)
+ band_names = [
+ "25",
+ "40",
+ "63",
+ "100",
+ "160",
+ "250",
+ "400",
+ "630",
+ "1k",
+ "1.6k",
+ "2.5k",
+ "4k",
+ "6.3k",
+ "10k",
+ "16k",
+ ]
+
+ eq = player.fetch("eq", Equalizer())
+ bands_num = eq._band_count
+ if band_value > 1:
+ band_value = 1
+ elif band_value <= -0.25:
+ band_value = -0.25
+ else:
+ band_value = round(band_value, 1)
+
+ try:
+ band_number = int(band_name_or_position) - 1
+ except ValueError:
+ band_number = None
+
+ if band_number not in range(0, bands_num) and band_name_or_position not in band_names:
+ return await self._embed_msg(
+ ctx,
+ _(
+ "Valid band numbers are 1-15 or the band names listed in "
+ "the help for this command."
+ ),
+ )
+
+ if band_name_or_position in band_names:
+ band_pos = band_names.index(band_name_or_position)
+ band_int = False
+ eq.set_gain(int(band_pos), band_value)
+ await self._apply_gain(ctx.guild.id, int(band_pos), band_value)
+ else:
+ band_int = True
+ eq.set_gain(band_number, band_value)
+ await self._apply_gain(ctx.guild.id, band_number, band_value)
+
+ await self._eq_msg_clear(player.fetch("eq_message"))
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
+ player.store("eq", eq)
+ band_name = band_names[band_number] if band_int else band_name_or_position
+ message = await ctx.send(
+ content=box(eq.visualise(), lang="ini"),
+ embed=discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_(
+ "The {band_name}Hz band has been set to {band_value}.".format(
+ band_name=band_name, band_value=band_value
+ )
+ ),
+ ),
+ )
+ player.store("eq_message", message)
@commands.group()
@commands.guild_only()
- async def local(self, ctx):
+ @commands.bot_has_permissions(embed_links=True, add_reactions=True)
+ async def local(self, ctx: commands.Context):
"""Local playback commands."""
- pass
@local.command(name="folder", aliases=["start"])
- async def local_folder(self, ctx, folder=None):
+ async def local_folder(
+ self, ctx: commands.Context, play_subfolders: Optional[bool] = True, *, folder: str = None
+ ):
"""Play all songs in a localtracks folder."""
if not await self._localtracks_check(ctx):
return
+
if not folder:
- await ctx.invoke(self.local_play)
+ await ctx.invoke(self.local_play, play_subfolders=play_subfolders)
else:
- try:
- folder_path = os.getcwd() + "/localtracks/{}/".format(folder)
- os.listdir(folder_path)
- except OSError:
+ folder = folder.strip()
+ _dir = dataclasses.LocalPath.joinpath(folder)
+ if not _dir.exists():
return await self._embed_msg(
ctx, _("No localtracks folder named {name}.").format(name=folder)
)
- await self._local_play_all(ctx, folder)
+ query = dataclasses.Query.process_input(_dir, search_subfolders=play_subfolders)
+ await self._local_play_all(ctx, query, from_search=False if not folder else True)
@local.command(name="play")
- async def local_play(self, ctx):
+ async def local_play(self, ctx: commands.Context, play_subfolders: Optional[bool] = True):
"""Play a local track."""
if not await self._localtracks_check(ctx):
return
- localtracks_folders = await self._localtracks_folders(ctx)
+ localtracks_folders = await self._localtracks_folders(
+ ctx, search_subfolders=play_subfolders
+ )
if not localtracks_folders:
- return await self._embed_msg(ctx, _("No local track folders found."))
- len_folder_pages = math.ceil(len(localtracks_folders) / 5)
- folder_page_list = []
- for page_num in range(1, len_folder_pages + 1):
- embed = await self._build_search_page(ctx, localtracks_folders, page_num)
- folder_page_list.append(embed)
+ return await self._embed_msg(ctx, _("No album folders found."))
+ async with ctx.typing():
+ len_folder_pages = math.ceil(len(localtracks_folders) / 5)
+ folder_page_list = []
+ for page_num in range(1, len_folder_pages + 1):
+ embed = await self._build_search_page(ctx, localtracks_folders, page_num)
+ folder_page_list.append(embed)
async def _local_folder_menu(
ctx: commands.Context,
@@ -818,11 +2032,12 @@ class Audio(commands.Cog):
emoji: str,
):
if message:
- await message.delete()
+ with contextlib.suppress(discord.HTTPException):
+ await message.delete()
await self._search_button_action(ctx, localtracks_folders, emoji, page)
return None
- LOCAL_FOLDER_CONTROLS = {
+ local_folder_controls = {
"1⃣": _local_folder_menu,
"2⃣": _local_folder_menu,
"3⃣": _local_folder_menu,
@@ -834,134 +2049,136 @@ class Audio(commands.Cog):
}
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
- if dj_enabled:
- if not await self._can_instaskip(ctx, ctx.author):
- return await menu(ctx, folder_page_list, DEFAULT_CONTROLS)
- else:
- await menu(ctx, folder_page_list, LOCAL_FOLDER_CONTROLS)
+ if dj_enabled and not await self._can_instaskip(ctx, ctx.author):
+ return await menu(ctx, folder_page_list, DEFAULT_CONTROLS)
else:
- await menu(ctx, folder_page_list, LOCAL_FOLDER_CONTROLS)
+ await menu(ctx, folder_page_list, local_folder_controls)
@local.command(name="search")
- async def local_search(self, ctx, *, search_words):
+ async def local_search(
+ self, ctx: commands.Context, play_subfolders: Optional[bool] = True, *, search_words
+ ):
"""Search for songs across all localtracks folders."""
if not await self._localtracks_check(ctx):
return
- localtracks_folders = await self._localtracks_folders(ctx)
- if not localtracks_folders:
+ all_tracks = await self._folder_list(
+ ctx,
+ (
+ dataclasses.Query.process_input(
+ dataclasses.LocalPath(
+ await self.config.localpath()
+ ).localtrack_folder.absolute(),
+ search_subfolders=play_subfolders,
+ )
+ ),
+ )
+ if not all_tracks:
return await self._embed_msg(ctx, _("No album folders found."))
- all_tracks = []
- for local_folder in localtracks_folders:
- folder_tracks = await self._folder_list(ctx, local_folder)
- all_tracks = all_tracks + folder_tracks
- search_list = await self._build_local_search_list(all_tracks, search_words)
+ async with ctx.typing():
+ search_list = await self._build_local_search_list(all_tracks, search_words)
if not search_list:
return await self._embed_msg(ctx, _("No matches."))
- await ctx.invoke(self.search, query=search_list)
+ return await ctx.invoke(self.search, query=search_list)
- async def _all_folder_tracks(self, ctx, folder):
+ async def _localtracks_folders(self, ctx: commands.Context, search_subfolders=False):
+ audio_data = dataclasses.LocalPath(
+ dataclasses.LocalPath(None).localtrack_folder.absolute()
+ )
if not await self._localtracks_check(ctx):
return
- allowed_files = (".mp3", ".flac", ".ogg")
- current_folder = os.getcwd() + "/localtracks/{}/".format(folder)
- folder_list = sorted(
- (
- f
- for f in os.listdir(current_folder)
- if (f.lower().endswith(allowed_files)) and (os.path.isfile(current_folder + f))
- ),
- key=lambda s: s.casefold(),
+
+ return audio_data.subfolders_in_tree() if search_subfolders else audio_data.subfolders()
+
+ async def _folder_list(self, ctx: commands.Context, query: dataclasses.Query):
+ if not await self._localtracks_check(ctx):
+ return
+ query = dataclasses.Query.process_input(query)
+ if not query.track.exists():
+ return
+ return (
+ query.track.tracks_in_tree()
+ if query.search_subfolders
+ else query.track.tracks_in_folder()
)
- track_listing = []
- for localtrack_location in folder_list:
- track_listing.append(localtrack_location)
- return track_listing
+
+ async def _folder_tracks(
+ self, ctx, player: lavalink.player_manager.Player, query: dataclasses.Query
+ ):
+ if not await self._localtracks_check(ctx):
+ return
+
+ audio_data = dataclasses.LocalPath(None)
+ try:
+ query.track.path.relative_to(audio_data.to_string())
+ except ValueError:
+ return
+ local_tracks = []
+ for local_file in await self._all_folder_tracks(ctx, query):
+ trackdata, called_api = await self.music_cache.lavalink_query(ctx, player, local_file)
+ with contextlib.suppress(IndexError):
+ local_tracks.append(trackdata.tracks[0])
+ return local_tracks
+
+ async def _local_play_all(
+ self, ctx: commands.Context, query: dataclasses.Query, from_search=False
+ ):
+ if not await self._localtracks_check(ctx):
+ return
+ if from_search:
+ query = dataclasses.Query.process_input(
+ query.track.to_string(), invoked_from="local folder"
+ )
+ await ctx.invoke(self.search, query=query)
+
+ async def _all_folder_tracks(self, ctx: commands.Context, query: dataclasses.Query):
+ if not await self._localtracks_check(ctx):
+ return
+
+ return (
+ query.track.tracks_in_tree()
+ if query.search_subfolders
+ else query.track.tracks_in_folder()
+ )
+
+ async def _localtracks_check(self, ctx: commands.Context):
+ folder = dataclasses.LocalPath(None)
+ if folder.localtrack_folder.exists():
+ return True
+ if ctx.invoked_with != "start":
+ await self._embed_msg(ctx, _("No localtracks folder."))
+ return False
@staticmethod
async def _build_local_search_list(to_search, search_words):
- search_results = process.extract(search_words, to_search, limit=50)
+ to_search_string = {i.track.name for i in to_search}
+ search_results = process.extract(search_words, to_search_string, limit=50)
search_list = []
for track_match, percent_match in search_results:
- if percent_match > 75:
- search_list.append(track_match)
- return search_list
-
- async def _folder_list(self, ctx, folder):
- if not await self._localtracks_check(ctx):
- return
- allowed_files = (".mp3", ".flac", ".ogg")
- folder_list = sorted(
- (
- os.getcwd() + "/localtracks/{}/{}".format(folder, f)
- for f in os.listdir(os.getcwd() + "/localtracks/{}/".format(folder))
- if (f.lower().endswith(allowed_files))
- and (os.path.isfile(os.getcwd() + "/localtracks/{}/{}".format(folder, f)))
- ),
- key=lambda s: s.casefold(),
- )
- track_listing = []
- if ctx.invoked_with == "search":
- local_path = await self.config.localpath()
- for localtrack_location in folder_list:
- track_listing.append(
- localtrack_location.replace("{}/localtracks/".format(local_path), "")
+ if percent_match > 60:
+ search_list.extend(
+ [i.track.to_string_hidden() for i in to_search if i.track.name == track_match]
)
- else:
- for localtrack_location in folder_list:
- localtrack_location = "localtrack:{}".format(localtrack_location)
- track_listing.append(localtrack_location)
- return track_listing
-
- async def _folder_tracks(self, ctx, player, folder):
- if not await self._localtracks_check(ctx):
- return
- local_tracks = []
- for local_file in await self._all_folder_tracks(ctx, folder):
- track = await player.get_tracks("localtracks/{}/{}".format(folder, local_file))
- try:
- local_tracks.append(track[0])
- except IndexError:
- pass
- return local_tracks
-
- async def _local_play_all(self, ctx, folder):
- if not await self._localtracks_check(ctx):
- return
- await ctx.invoke(self.search, query=("folder:" + folder))
-
- async def _localtracks_check(self, ctx):
- audio_data = await self.config.localpath()
- if os.getcwd() != audio_data:
- os.chdir(audio_data)
- localtracks_folder = any(
- f for f in os.listdir(os.getcwd()) if not os.path.isfile(f) if f == "localtracks"
- )
- if not localtracks_folder:
- if ctx.invoked_with == "start":
- return False
- else:
- await self._embed_msg(ctx, _("No localtracks folder."))
- return False
- else:
- return True
+ return search_list
@commands.command()
@commands.guild_only()
- async def now(self, ctx):
+ @commands.bot_has_permissions(embed_links=True, add_reactions=True)
+ async def now(self, ctx: commands.Context):
"""Now playing."""
if not self._player_check(ctx):
return await self._embed_msg(ctx, _("Nothing playing."))
- expected = ("⏮", "⏹", "⏸", "⏭")
- emoji = {"prev": "⏮", "stop": "⏹", "pause": "⏸", "next": "⏭"}
+ expected = ("⏮", "⏹", "⏯", "⏭")
+ emoji = {"prev": "⏮", "stop": "⏹", "pause": "⏯", "next": "⏭"}
player = lavalink.get_player(ctx.guild.id)
if player.current:
- arrow = await self._draw_time(ctx)
+ arrow = await draw_time(ctx)
pos = lavalink.utils.format_time(player.position)
if player.current.is_stream:
dur = "LIVE"
else:
dur = lavalink.utils.format_time(player.current.length)
- if "localtracks" in player.current.uri:
+ query = dataclasses.Query.process_input(player.current.uri)
+ if query.is_local:
if not player.current.title == "Unknown title":
song = "**{track.author} - {track.title}**\n{uri}\n"
else:
@@ -972,7 +2189,9 @@ class Audio(commands.Cog):
song += "\n\n{arrow}`{pos}`/`{dur}`"
song = song.format(
track=player.current,
- uri=player.current.uri.replace("localtracks/", ""),
+ uri=dataclasses.LocalPath(player.current.uri).to_string_hidden()
+ if dataclasses.Query.process_input(player.current.uri).is_local
+ else player.current.uri,
arrow=arrow,
pos=pos,
dur=dur,
@@ -981,10 +2200,8 @@ class Audio(commands.Cog):
song = _("Nothing.")
if player.fetch("np_message") is not None:
- try:
+ with contextlib.suppress(discord.HTTPException):
await player.fetch("np_message").delete()
- except discord.errors.NotFound:
- pass
embed = discord.Embed(
colour=await ctx.embed_colour(), title=_("Now Playing"), description=song
@@ -992,7 +2209,32 @@ class Audio(commands.Cog):
if await self.config.guild(ctx.guild).thumbnail() and player.current:
if player.current.thumbnail:
embed.set_thumbnail(url=player.current.thumbnail)
+
+ shuffle = await self.config.guild(ctx.guild).shuffle()
+ repeat = await self.config.guild(ctx.guild).repeat()
+ autoplay = await self.config.guild(ctx.guild).auto_play() or self.owns_autoplay
+ text = ""
+ text += (
+ _("Auto-Play")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if autoplay else "\N{CROSS MARK}")
+ )
+ text += (
+ (" | " if text else "")
+ + _("Shuffle")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if shuffle else "\N{CROSS MARK}")
+ )
+ text += (
+ (" | " if text else "")
+ + _("Repeat")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if repeat else "\N{CROSS MARK}")
+ )
+ embed.set_footer(text=text)
+
message = await ctx.send(embed=embed)
+
player.store("np_message", message)
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
@@ -1012,31 +2254,32 @@ class Audio(commands.Cog):
(r, u) = await self.bot.wait_for(
"reaction_add",
check=ReactionPredicate.with_emojis(expected, message, ctx.author),
- timeout=10.0,
+ timeout=30.0,
)
except asyncio.TimeoutError:
- return await self._clear_react(message)
+ return await self._clear_react(message, emoji)
else:
if task is not None:
task.cancel()
reacts = {v: k for k, v in emoji.items()}
react = reacts[r.emoji]
if react == "prev":
- await self._clear_react(message)
+ await self._clear_react(message, emoji)
await ctx.invoke(self.prev)
elif react == "stop":
- await self._clear_react(message)
+ await self._clear_react(message, emoji)
await ctx.invoke(self.stop)
elif react == "pause":
- await self._clear_react(message)
+ await self._clear_react(message, emoji)
await ctx.invoke(self.pause)
elif react == "next":
- await self._clear_react(message)
+ await self._clear_react(message, emoji)
await ctx.invoke(self.skip)
@commands.command()
@commands.guild_only()
- async def pause(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def pause(self, ctx: commands.Context):
"""Pause or resume a playing track."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx):
@@ -1058,12 +2301,14 @@ class Audio(commands.Cog):
if not player.current:
return await self._embed_msg(ctx, _("Nothing playing."))
- if "localtracks/" in player.current.uri:
+ query = dataclasses.Query.process_input(player.current.uri)
+ if query.is_local:
+ query = dataclasses.Query.process_input(player.current.uri)
if player.current.title == "Unknown title":
- description = player.current.uri
+ description = "{}".format(query.track.to_string_hidden())
else:
song = bold("{} - {}").format(player.current.author, player.current.title)
- description = "{}\n{}".format(song, player.current.uri.replace("localtracks/", ""))
+ description = "{}\n{}".format(song, query.track.to_string_hidden())
else:
description = bold("[{}]({})").format(player.current.title, player.current.uri)
@@ -1084,7 +2329,8 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def percent(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def percent(self, ctx: commands.Context):
"""Queue percentage."""
if not self._player_check(ctx):
return await self._embed_msg(ctx, _("Nothing playing."))
@@ -1111,7 +2357,7 @@ class Audio(commands.Cog):
)
await _usercount(req_username)
except AttributeError:
- return await self._embed_msg(ctx, _("Nothing in the queue."))
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
for req_username in requesters["users"]:
percentage = float(requesters["users"][req_username]["songcount"]) / float(
@@ -1140,22 +2386,26 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def play(self, ctx, *, query):
+ @commands.bot_has_permissions(embed_links=True)
+ async def play(self, ctx: commands.Context, *, query: str):
"""Play a URL or search for a track."""
-
guild_data = await self.config.guild(ctx.guild).all()
restrict = await self.config.restrict()
- if restrict:
- if self._match_url(query):
- url_check = self._url_check(query)
- if not url_check:
- return await self._embed_msg(ctx, _("That URL is not allowed."))
+ if restrict and match_url(query):
+ valid_url = url_check(query)
+ if not valid_url:
+ return await self._embed_msg(ctx, _("That URL is not allowed."))
if not self._player_check(ctx):
+ if self._connection_aborted:
+ msg = _("Connection to Lavalink has failed.")
+ if await ctx.bot.is_owner(ctx.author):
+ msg += " " + _("Please check your console or logs for details.")
+ return await self._embed_msg(ctx, msg)
try:
if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
- and self._userlimit(ctx.author.voice.channel)
+ and userlimit(ctx.author.voice.channel)
):
return await self._embed_msg(
ctx, _("I don't have permission to connect to your channel.")
@@ -1173,8 +2423,10 @@ class Audio(commands.Cog):
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, _("You need the DJ role to queue tracks."))
player = lavalink.get_player(ctx.guild.id)
+
player.store("channel", ctx.channel.id)
player.store("guild", ctx.guild.id)
+ await self._eq_check(ctx, player)
await self._data_check(ctx)
if (
not ctx.author.voice or ctx.author.voice.channel != player.channel
@@ -1184,155 +2436,451 @@ class Audio(commands.Cog):
)
if not await self._currency_check(ctx, guild_data["jukebox_price"]):
return
-
- if not query:
+ query = dataclasses.Query.process_input(query)
+ if not query.valid:
return await self._embed_msg(ctx, _("No tracks to play."))
- query = query.strip("<>")
-
- if "open.spotify.com" in query:
- query = "spotify:{}".format(
- re.sub("(http[s]?:\/\/)?(open.spotify.com)\/", "", query).replace("/", ":")
- )
- if query.startswith("spotify:"):
+ if query.is_spotify:
return await self._get_spotify_tracks(ctx, query)
-
- if query.startswith("localtrack:"):
- local_path = await self.config.localpath()
- await self._localtracks_check(ctx)
- query = query.replace("localtrack:", "").replace(((local_path) + "/"), "")
- allowed_files = (".mp3", ".flac", ".ogg")
- if not self._match_url(query) and not (query.lower().endswith(allowed_files)):
- query = "ytsearch:{}".format(query)
-
await self._enqueue_tracks(ctx, query)
- async def _get_spotify_tracks(self, ctx, query):
- if ctx.invoked_with == "play":
+ @commands.command()
+ @commands.guild_only()
+ @commands.bot_has_permissions(embed_links=True)
+ async def genre(self, ctx: commands.Context):
+ """Pick a Spotify playlist from a list of categories to start playing."""
+
+ async def _category_search_menu(
+ ctx: commands.Context,
+ pages: list,
+ controls: dict,
+ message: discord.Message,
+ page: int,
+ timeout: float,
+ emoji: str,
+ ):
+ if message:
+ output = await self._genre_search_button_action(ctx, category_list, emoji, page)
+ with contextlib.suppress(discord.HTTPException):
+ await message.delete()
+ return output
+
+ async def _playlist_search_menu(
+ ctx: commands.Context,
+ pages: list,
+ controls: dict,
+ message: discord.Message,
+ page: int,
+ timeout: float,
+ emoji: str,
+ ):
+ if message:
+ output = await self._genre_search_button_action(
+ ctx, playlists_list, emoji, page, playlist=True
+ )
+ with contextlib.suppress(discord.HTTPException):
+ await message.delete()
+ return output
+
+ category_search_controls = {
+ "1⃣": _category_search_menu,
+ "2⃣": _category_search_menu,
+ "3⃣": _category_search_menu,
+ "4⃣": _category_search_menu,
+ "5⃣": _category_search_menu,
+ "⬅": prev_page,
+ "❌": close_menu,
+ "➡": next_page,
+ }
+ playlist_search_controls = {
+ "1⃣": _playlist_search_menu,
+ "2⃣": _playlist_search_menu,
+ "3⃣": _playlist_search_menu,
+ "4⃣": _playlist_search_menu,
+ "5⃣": _playlist_search_menu,
+ "⬅": prev_page,
+ "❌": close_menu,
+ "➡": next_page,
+ }
+
+ api_data = await self._check_api_tokens()
+ if any(
+ [
+ not api_data["spotify_client_id"],
+ not api_data["spotify_client_secret"],
+ not api_data["youtube_api"],
+ ]
+ ):
+ return await self._embed_msg(
+ ctx,
+ _(
+ "The owner needs to set the Spotify client ID, Spotify client secret, "
+ "and YouTube API key before Spotify URLs or codes can be used. "
+ "\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` "
+ "for instructions."
+ ).format(prefix=ctx.prefix),
+ )
+ guild_data = await self.config.guild(ctx.guild).all()
+ if not self._player_check(ctx):
+ if self._connection_aborted:
+ msg = _("Connection to Lavalink has failed.")
+ if await ctx.bot.is_owner(ctx.author):
+ msg += " " + _("Please check your console or logs for details.")
+ return await self._embed_msg(ctx, msg)
+ try:
+ if (
+ not ctx.author.voice.channel.permissions_for(ctx.me).connect
+ or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
+ and userlimit(ctx.author.voice.channel)
+ ):
+ return await self._embed_msg(
+ ctx, _("I don't have permission to connect to your channel.")
+ )
+ await lavalink.connect(ctx.author.voice.channel)
+ player = lavalink.get_player(ctx.guild.id)
+ player.store("connect", datetime.datetime.utcnow())
+ except AttributeError:
+ return await self._embed_msg(ctx, _("Connect to a voice channel first."))
+ except IndexError:
+ return await self._embed_msg(
+ ctx, _("Connection to Lavalink has not yet been established.")
+ )
+ if guild_data["dj_enabled"]:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(ctx, _("You need the DJ role to queue tracks."))
+ player = lavalink.get_player(ctx.guild.id)
+
+ player.store("channel", ctx.channel.id)
+ player.store("guild", ctx.guild.id)
+ await self._eq_check(ctx, player)
+ await self._data_check(ctx)
+ if (
+ not ctx.author.voice or ctx.author.voice.channel != player.channel
+ ) and not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You must be in the voice channel to use the genre command.")
+ )
+ try:
+ category_list = await self.music_cache.spotify_api.get_categories()
+ except SpotifyFetchError as error:
+ return await self._embed_msg(ctx, _(error.message).format(prefix=ctx.prefix))
+ if not category_list:
+ return await self._embed_msg(ctx, _("No categories found, try again later."))
+ len_folder_pages = math.ceil(len(category_list) / 5)
+ category_search_page_list = []
+ for page_num in range(1, len_folder_pages + 1):
+ embed = await self._build_genre_search_page(
+ ctx, category_list, page_num, _("Categories")
+ )
+ category_search_page_list.append(embed)
+ cat_menu_output = await menu(ctx, category_search_page_list, category_search_controls)
+ if not cat_menu_output:
+ return await self._embed_msg(ctx, _("No categories selected, try again later."))
+ category_name, category_pick = cat_menu_output
+ playlists_list = await self.music_cache.spotify_api.get_playlist_from_category(
+ category_pick
+ )
+ if not playlists_list:
+ return await self._embed_msg(ctx, _("No categories found, try again later."))
+ len_folder_pages = math.ceil(len(playlists_list) / 5)
+ playlists_search_page_list = []
+ for page_num in range(1, len_folder_pages + 1):
+ embed = await self._build_genre_search_page(
+ ctx,
+ playlists_list,
+ page_num,
+ _("Playlists for {friendly_name}").format(friendly_name=category_name),
+ playlist=True,
+ )
+ playlists_search_page_list.append(embed)
+ playlists_pick = await menu(ctx, playlists_search_page_list, playlist_search_controls)
+ query = dataclasses.Query.process_input(playlists_pick)
+ if not query.valid:
+ return await self._embed_msg(ctx, _("No tracks to play."))
+ if not await self._currency_check(ctx, guild_data["jukebox_price"]):
+ return
+ if query.is_spotify:
+ return await self._get_spotify_tracks(ctx, query)
+ return await self._embed_msg(ctx, _("Couldn't find tracks for the selected playlist."))
+
+ @staticmethod
+ async def _genre_search_button_action(
+ ctx: commands.Context, options, emoji, page, playlist=False
+ ):
+ try:
+ if emoji == "1⃣":
+ search_choice = options[0 + (page * 5)]
+ elif emoji == "2⃣":
+ search_choice = options[1 + (page * 5)]
+ elif emoji == "3⃣":
+ search_choice = options[2 + (page * 5)]
+ elif emoji == "4⃣":
+ search_choice = options[3 + (page * 5)]
+ elif emoji == "5⃣":
+ search_choice = options[4 + (page * 5)]
+ else:
+ search_choice = options[0 + (page * 5)]
+ # TODO: Verify this doesn't break exit and arrows
+ except IndexError:
+ search_choice = options[-1]
+ if not playlist:
+ return list(search_choice.items())[0]
+ else:
+ return search_choice.get("uri")
+
+ @staticmethod
+ async def _build_genre_search_page(
+ ctx: commands.Context, tracks, page_num, title, playlist=False
+ ):
+ search_num_pages = math.ceil(len(tracks) / 5)
+ search_idx_start = (page_num - 1) * 5
+ search_idx_end = search_idx_start + 5
+ search_list = ""
+ for i, entry in enumerate(tracks[search_idx_start:search_idx_end], start=search_idx_start):
+ search_track_num = i + 1
+ if search_track_num > 5:
+ search_track_num = search_track_num % 5
+ if search_track_num == 0:
+ search_track_num = 5
+ if playlist:
+ name = "**[{}]({})** - {}".format(
+ entry.get("name"),
+ entry.get("url"),
+ str(entry.get("tracks")) + " " + _("tracks"),
+ )
+ else:
+ name = f"{list(entry.keys())[0]}"
+ search_list += "`{}.` {}\n".format(search_track_num, name)
+
+ embed = discord.Embed(
+ colour=await ctx.embed_colour(), title=title, description=search_list
+ )
+ embed.set_footer(
+ text=_("Page {page_num}/{total_pages}").format(
+ page_num=page_num, total_pages=search_num_pages
+ )
+ )
+ return embed
+
+ @commands.command()
+ @commands.guild_only()
+ @commands.bot_has_permissions(embed_links=True)
+ @checks.mod_or_permissions(manage_messages=True)
+ async def autoplay(self, ctx: commands.Context):
+ """Starts auto play."""
+ if not self._player_check(ctx):
+ if self._connection_aborted:
+ msg = _("Connection to Lavalink has failed.")
+ if await ctx.bot.is_owner(ctx.author):
+ msg += " " + _("Please check your console or logs for details.")
+ return await self._embed_msg(ctx, msg)
+ try:
+ if (
+ not ctx.author.voice.channel.permissions_for(ctx.me).connect
+ or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
+ and userlimit(ctx.author.voice.channel)
+ ):
+ return await self._embed_msg(
+ ctx, _("I don't have permission to connect to your channel.")
+ )
+ await lavalink.connect(ctx.author.voice.channel)
+ player = lavalink.get_player(ctx.guild.id)
+ player.store("connect", datetime.datetime.utcnow())
+ except AttributeError:
+ return await self._embed_msg(ctx, _("Connect to a voice channel first."))
+ except IndexError:
+ return await self._embed_msg(
+ ctx, _("Connection to Lavalink has not yet been established.")
+ )
+ guild_data = await self.config.guild(ctx.guild).all()
+ if guild_data["dj_enabled"]:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(ctx, _("You need the DJ role to queue tracks."))
+ player = lavalink.get_player(ctx.guild.id)
+
+ player.store("channel", ctx.channel.id)
+ player.store("guild", ctx.guild.id)
+ await self._eq_check(ctx, player)
+ await self._data_check(ctx)
+ if (
+ not ctx.author.voice or ctx.author.voice.channel != player.channel
+ ) and not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(
+ ctx, _("You must be in the voice channel to use the autoplay command.")
+ )
+ if not await self._currency_check(ctx, guild_data["jukebox_price"]):
+ return
+ if self.owns_autoplay is None:
+ await self.music_cache.autoplay(player)
+ else:
+ self.bot.dispatch(
+ "red_audio_should_auto_play",
+ player,
+ player.channel.guild,
+ player.channel,
+ self.play_query,
+ )
+ if not guild_data["auto_play"]:
+ await ctx.invoke(self._autoplay_toggle)
+ if not guild_data["notify"] and (
+ (player.current and not player.current.extras.get("autoplay")) or not player.current
+ ):
+ await self._embed_msg(ctx, _("Auto play started."))
+ elif player.current:
+ await self._embed_msg(ctx, _("Adding a track to queue."))
+
+ async def _get_spotify_tracks(self, ctx: commands.Context, query: dataclasses.Query):
+ if ctx.invoked_with in ["play", "genre"]:
enqueue_tracks = True
else:
enqueue_tracks = False
player = lavalink.get_player(ctx.guild.id)
api_data = await self._check_api_tokens()
- guild_data = await self.config.guild(ctx.guild).all()
- if "open.spotify.com" in query:
- query = "spotify:{}".format(
- re.sub("(http[s]?:\/\/)?(open.spotify.com)\/", "", query).replace("/", ":")
+
+ if (
+ not api_data["spotify_client_id"]
+ or not api_data["spotify_client_secret"]
+ or not api_data["youtube_api"]
+ ):
+ return await self._embed_msg(
+ ctx,
+ _(
+ "The owner needs to set the Spotify client ID, Spotify client secret, "
+ "and YouTube API key before Spotify URLs or codes can be used. "
+ "\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` "
+ "for instructions."
+ ).format(prefix=ctx.prefix),
)
- if query.startswith("spotify:"):
- if (
- not api_data["spotify_client_id"]
- or not api_data["spotify_client_secret"]
- or not api_data["youtube_api"]
- ):
+ try:
+ if self.play_lock[ctx.message.guild.id]:
+ return await self._embed_msg(
+ ctx, _("Wait until the playlist has finished loading.")
+ )
+ except KeyError:
+ pass
+
+ if query.single_track:
+ try:
+ res = await self.music_cache.spotify_query(
+ ctx, "track", query.id, skip_youtube=True, notifier=None
+ )
+ if not res:
+ return await self._embed_msg(ctx, _("Nothing found."))
+ except SpotifyFetchError as error:
+ self._play_lock(ctx, False)
+ return await self._embed_msg(ctx, _(error.message).format(prefix=ctx.prefix))
+ self._play_lock(ctx, False)
+ try:
+ if enqueue_tracks:
+ new_query = dataclasses.Query.process_input(res[0])
+ new_query.start_time = query.start_time
+ return await self._enqueue_tracks(ctx, new_query)
+ else:
+ result, called_api = await self.music_cache.lavalink_query(
+ ctx, player, dataclasses.Query.process_input(res[0])
+ )
+ tracks = result.tracks
+ if not tracks:
+ return await self._embed_msg(ctx, _("Nothing found."))
+ single_track = tracks[0]
+ single_track.start_timestamp = query.start_time * 1000
+ single_track = [single_track]
+
+ return single_track
+
+ except KeyError:
+ self._play_lock(ctx, False)
return await self._embed_msg(
ctx,
_(
- "The owner needs to set the Spotify client ID, Spotify client secret, "
- "and YouTube API key before Spotify URLs or codes can be used. "
- "\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` "
- "for instructions."
+ "The Spotify API key or client secret has not been set properly. "
+ "\nUse `{prefix}audioset spotifyapi` for instructions."
).format(prefix=ctx.prefix),
)
- try:
- if self.play_lock[ctx.message.guild.id]:
- return await self._embed_msg(
- ctx, _("Wait until the playlist has finished loading.")
- )
- except KeyError:
- pass
+ elif query.is_album or query.is_playlist:
+ self._play_lock(ctx, True)
+ track_list = await self._spotify_playlist(
+ ctx, "album" if query.is_album else "playlist", query, enqueue_tracks
+ )
+ self._play_lock(ctx, False)
+ return track_list
+ else:
+ return await self._embed_msg(
+ ctx, _("This doesn't seem to be a supported Spotify URL or code.")
+ )
- parts = query.split(":")
- if "track" in parts:
- res = await self._make_spotify_req(
- "https://api.spotify.com/v1/tracks/{0}".format(parts[-1])
- )
- try:
- query = "{} {}".format(res["artists"][0]["name"], res["name"])
- if enqueue_tracks:
- return await self._enqueue_tracks(ctx, query)
- else:
- tracks = await player.get_tracks(f"ytsearch:{query}")
- if not tracks:
- return await self._embed_msg(ctx, _("Nothing found."))
- single_track = []
- single_track.append(tracks[0])
- return single_track
-
- except KeyError:
- return await self._embed_msg(
- ctx,
- _(
- "The Spotify API key or client secret has not been set properly. "
- "\nUse `{prefix}audioset spotifyapi` for instructions."
- ).format(prefix=ctx.prefix),
- )
- elif "album" in parts:
- query = parts[-1]
- self._play_lock(ctx, True)
- track_list = await self._spotify_playlist(
- ctx, "album", api_data["youtube_api"], query
- )
- if not track_list:
- self._play_lock(ctx, False)
- return
- if enqueue_tracks:
- return await self._enqueue_tracks(ctx, track_list)
- else:
- return track_list
- elif "playlist" in parts:
- query = parts[-1]
- self._play_lock(ctx, True)
- if "user" in parts:
- track_list = await self._spotify_playlist(
- ctx, "user_playlist", api_data["youtube_api"], query
- )
- else:
- track_list = await self._spotify_playlist(
- ctx, "playlist", api_data["youtube_api"], query
- )
- if not track_list:
- self._play_lock(ctx, False)
- return
- if enqueue_tracks:
- return await self._enqueue_tracks(ctx, track_list)
- else:
- return track_list
-
- else:
- return await self._embed_msg(
- ctx, _("This doesn't seem to be a valid Spotify URL or code.")
- )
-
- async def _enqueue_tracks(self, ctx, query):
+ async def _enqueue_tracks(self, ctx: commands.Context, query: Union[dataclasses.Query, list]):
player = lavalink.get_player(ctx.guild.id)
+ try:
+ if self.play_lock[ctx.message.guild.id]:
+ return await self._embed_msg(
+ ctx, _("Wait until the playlist has finished loading.")
+ )
+ except KeyError:
+ self._play_lock(ctx, True)
guild_data = await self.config.guild(ctx.guild).all()
+ first_track_only = False
+ index = None
+ playlist_data = None
+ seek = 0
if type(query) is not list:
- if not (
- query.startswith("http")
- or query.startswith("localtracks")
- or query.startswith("ytsearch:")
- ):
- query = f"ytsearch:{query}"
- tracks = await player.get_tracks(query)
+
+ if query.single_track:
+ first_track_only = True
+ index = query.track_index
+ if query.start_time:
+ seek = query.start_time
+ result, called_api = await self.music_cache.lavalink_query(ctx, player, query)
+ tracks = result.tracks
+ playlist_data = result.playlist_info
if not tracks:
- return await self._embed_msg(ctx, _("Nothing found."))
+ self._play_lock(ctx, False)
+ embed = discord.Embed(title=_("Nothing found."), colour=await ctx.embed_colour())
+ if await self.config.use_external_lavalink() and query.is_local:
+ embed.description = _(
+ "Local tracks will not work "
+ "if the `Lavalink.jar` cannot see the track.\n"
+ "This may be due to permissions or because Lavalink.jar is being run "
+ "in a different machine than the local tracks."
+ )
+ return await ctx.send(embed=embed)
else:
tracks = query
-
- queue_duration = await self._queue_duration(ctx)
- queue_total_duration = lavalink.utils.format_time(queue_duration)
+ queue_dur = await queue_duration(ctx)
+ queue_total_duration = lavalink.utils.format_time(queue_dur)
before_queue_length = len(player.queue)
- if ("ytsearch:" or "localtrack") not in query and len(tracks) > 1:
+ if not first_track_only and len(tracks) > 1:
+ # a list of Tracks where all should be enqueued
+ # this is a Spotify playlist aleady made into a list of Tracks or a
+ # url where Lavalink handles providing all Track objects to use, like a
+ # YouTube or Soundcloud playlist
track_len = 0
+ empty_queue = not player.queue
for track in tracks:
- if guild_data["maxlength"] > 0:
- if self._track_limit(ctx, track, guild_data["maxlength"]):
+ if not await is_allowed(
+ ctx.guild,
+ (
+ f"{track.title} {track.author} {track.uri} "
+ f"{str(dataclasses.Query.process_input(track))}"
+ ),
+ ):
+ log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
+ continue
+ elif guild_data["maxlength"] > 0:
+ if track_limit(track, guild_data["maxlength"]):
track_len += 1
player.add(ctx.author, track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, track, ctx.author
+ )
+
else:
track_len += 1
player.add(ctx.author, track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, track, ctx.author
+ )
+ player.maybe_shuffle(0 if empty_queue else 1)
if len(tracks) > track_len:
maxlength_msg = " {bad_tracks} tracks cannot be queued.".format(
@@ -1342,12 +2890,17 @@ class Audio(commands.Cog):
maxlength_msg = ""
embed = discord.Embed(
colour=await ctx.embed_colour(),
- title=_("Playlist Enqueued"),
- description=_("Added {num} tracks to the queue.{maxlength_msg}").format(
- num=track_len, maxlength_msg=maxlength_msg
+ description="{name}".format(
+ name=playlist_data.name if playlist_data else _("No Title")
),
+ title=_("Playlist Enqueued"),
)
- if not guild_data["shuffle"] and queue_duration > 0:
+ embed.set_footer(
+ text=_("Added {num} tracks to the queue.{maxlength_msg}").format(
+ num=track_len, maxlength_msg=maxlength_msg
+ )
+ )
+ if not guild_data["shuffle"] and queue_dur > 0:
embed.set_footer(
text=_(
"{time} until start of playlist playback: starts at #{position} in queue"
@@ -1356,453 +2909,1222 @@ class Audio(commands.Cog):
if not player.current:
await player.play()
else:
+ # a ytsearch: prefixed item where we only need the first Track returned
+ # this is in the case of [p]play , a single Spotify url/code
+ # or this is a localtrack item
try:
- single_track = tracks[0]
- if guild_data["maxlength"] > 0:
- if self._track_limit(ctx, single_track, guild_data["maxlength"]):
+
+ single_track = tracks[index] if index else tracks[0]
+ if seek and seek > 0:
+ single_track.start_timestamp = seek * 1000
+ if not await is_allowed(
+ ctx.guild,
+ (
+ f"{single_track.title} {single_track.author} {single_track.uri} "
+ f"{str(dataclasses.Query.process_input(single_track))}"
+ ),
+ ):
+ log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
+ self._play_lock(ctx, False)
+ return await self._embed_msg(
+ ctx, _("This track is not allowed in this server.")
+ )
+ elif guild_data["maxlength"] > 0:
+ if track_limit(single_track, guild_data["maxlength"]):
player.add(ctx.author, single_track)
+ player.maybe_shuffle()
+ self.bot.dispatch(
+ "red_audio_track_enqueue",
+ player.channel.guild,
+ single_track,
+ ctx.author,
+ )
else:
+ self._play_lock(ctx, False)
return await self._embed_msg(ctx, _("Track exceeds maximum length."))
else:
player.add(ctx.author, single_track)
+ player.maybe_shuffle()
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, single_track, ctx.author
+ )
except IndexError:
+ self._play_lock(ctx, False)
return await self._embed_msg(
ctx, _("Nothing found. Check your Lavalink logs for details.")
)
-
- if "localtracks" in single_track.uri:
- if not single_track.title == "Unknown title":
+ query = dataclasses.Query.process_input(single_track.uri)
+ if query.is_local:
+ if single_track.title != "Unknown title":
description = "**{} - {}**\n{}".format(
single_track.author,
single_track.title,
- single_track.uri.replace("localtracks/", ""),
+ dataclasses.LocalPath(single_track.uri).to_string_hidden(),
)
else:
- description = "{}".format(single_track.uri.replace("localtracks/", ""))
+ description = "{}".format(
+ dataclasses.LocalPath(single_track.uri).to_string_hidden()
+ )
else:
description = "**[{}]({})**".format(single_track.title, single_track.uri)
embed = discord.Embed(
colour=await ctx.embed_colour(), title=_("Track Enqueued"), description=description
)
- if not guild_data["shuffle"] and queue_duration > 0:
+ if not guild_data["shuffle"] and queue_dur > 0:
embed.set_footer(
text=_("{time} until track playback: #{position} in queue").format(
time=queue_total_duration, position=before_queue_length + 1
)
)
- elif queue_duration > 0:
- embed.set_footer(text=_("#{position} in queue").format(position=len(player.queue)))
- if not player.current:
- await player.play()
+
await ctx.send(embed=embed)
- if type(query) is list:
- self._play_lock(ctx, False)
+ if not player.current:
+ await player.play()
+
+ self._play_lock(ctx, False)
+
+ async def _spotify_playlist(
+ self, ctx: commands.Context, stype: str, query: dataclasses.Query, enqueue: bool = False
+ ):
- async def _spotify_playlist(self, ctx, stype, yt_key, query):
player = lavalink.get_player(ctx.guild.id)
- spotify_info = []
- if stype == "album":
- r = await self._make_spotify_req("https://api.spotify.com/v1/albums/{0}".format(query))
- else:
- r = await self._make_spotify_req(
- "https://api.spotify.com/v1/playlists/{0}/tracks".format(query)
- )
try:
- if r["error"]["status"] == 401:
- return await self._embed_msg(
- ctx,
- _(
- "The Spotify API key or client secret has not been set properly. "
- "\nUse `{prefix}audioset spotifyapi` for instructions."
- ).format(prefix=ctx.prefix),
- )
- except KeyError:
- pass
- while True:
- try:
- try:
- spotify_info.extend(r["tracks"]["items"])
- except KeyError:
- spotify_info.extend(r["items"])
- except KeyError:
- return await self._embed_msg(
- ctx, _("This doesn't seem to be a valid Spotify URL or code.")
- )
+ embed1 = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Please wait, finding tracks...")
+ )
+ playlist_msg = await ctx.send(embed=embed1)
+ notifier = Notifier(
+ ctx,
+ playlist_msg,
+ {
+ "spotify": _("Getting track {num}/{total}..."),
+ "youtube": _("Matching track {num}/{total}..."),
+ "lavalink": _("Loading track {num}/{total}..."),
+ "lavalink_time": _("Approximate time remaining: {seconds}"),
+ },
+ )
+ track_list = await self.music_cache.spotify_enqueue(
+ ctx,
+ stype,
+ query.id,
+ enqueue=enqueue,
+ player=player,
+ lock=self._play_lock,
+ notifier=notifier,
+ )
+ except SpotifyFetchError as error:
+ self._play_lock(ctx, False)
+ return await self._embed_msg(ctx, _(error.message).format(prefix=ctx.prefix))
+ except (RuntimeError, aiohttp.ServerDisconnectedError):
+ self._play_lock(ctx, False)
+ error_embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("The connection was reset while loading the playlist."),
+ )
+ await ctx.send(embed=error_embed)
+ return None
+ except Exception as e:
+ self._play_lock(ctx, False)
+ raise e
+ self._play_lock(ctx, False)
+ return track_list
- try:
- if r["next"] is not None:
- r = await self._make_spotify_req(r["next"])
- continue
- else:
- break
- except KeyError:
- if r["tracks"]["next"] is not None:
- r = await self._make_spotify_req(r["tracks"]["next"])
- continue
- else:
- break
+ async def can_manage_playlist(
+ self, scope: str, playlist: Playlist, ctx: commands.Context, user, guild
+ ):
- embed1 = discord.Embed(
- colour=await ctx.embed_colour(), title=_("Please wait, adding tracks...")
+ is_owner = await ctx.bot.is_owner(ctx.author)
+ has_perms = False
+ user_to_query = user
+ guild_to_query = guild
+ dj_enabled = None
+ playlist_author = (
+ guild.get_member(playlist.author)
+ if guild
+ else self.bot.get_user(playlist.author) or user
)
- playlist_msg = await ctx.send(embed=embed1)
- track_list = []
- track_count = 0
- now = int(time.time())
- for i in spotify_info:
- if stype == "album":
- song_info = "{} {}".format(i["name"], i["artists"][0]["name"])
- else:
- song_info = "{} {}".format(i["track"]["name"], i["track"]["artists"][0]["name"])
- try:
- track_url = await self._youtube_api_search(yt_key, song_info)
- except (RuntimeError, aiohttp.client_exceptions.ServerDisconnectedError):
- error_embed = discord.Embed(
- colour=await ctx.embed_colour(),
- title=_("The connection was reset while loading the playlist."),
- )
- await playlist_msg.edit(embed=error_embed)
- return None
- pass
- try:
- yt_track = await player.get_tracks(track_url)
- except (RuntimeError, aiohttp.client_exceptions.ServerDisconnectedError):
- return
- try:
- track_list.append(yt_track[0])
- except IndexError:
- pass
- track_count += 1
- if (track_count % 5 == 0) or (track_count == len(spotify_info)):
- embed2 = discord.Embed(
- colour=await ctx.embed_colour(),
- title=_("Loading track {num}/{total}...").format(
- num=track_count, total=len(spotify_info)
+
+ is_different_user = len({playlist.author, user_to_query.id, ctx.author.id}) != 1
+ is_different_guild = True if guild_to_query is None else ctx.guild.id != guild_to_query.id
+
+ if is_owner:
+ has_perms = True
+ elif playlist.scope == PlaylistScope.USER.value:
+ if not is_different_user:
+ has_perms = True
+ elif playlist.scope == PlaylistScope.GUILD.value:
+ if not is_different_guild:
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if guild.owner_id == ctx.author.id:
+ has_perms = True
+ elif dj_enabled and await self._has_dj_role(ctx, ctx.author):
+ has_perms = True
+ elif await ctx.bot.is_mod(ctx.author):
+ has_perms = True
+ elif not dj_enabled and not is_different_user:
+ has_perms = True
+
+ if has_perms is False:
+ if hasattr(playlist, "name"):
+ msg = _(
+ "You do not have the permissions to manage {name} " "(`{id}`) [**{scope}**]."
+ ).format(
+ user=playlist_author,
+ name=playlist.name,
+ id=playlist.id,
+ scope=humanize_scope(
+ playlist.scope,
+ ctx=guild_to_query
+ if playlist.scope == PlaylistScope.GUILD.value
+ else playlist_author
+ if playlist.scope == PlaylistScope.USER.value
+ else None,
),
)
- if track_count == 5:
- five_time = int(time.time()) - now
- if track_count >= 5:
- remain_tracks = len(spotify_info) - track_count
- time_remain = (remain_tracks / 5) * five_time
- if track_count < len(spotify_info):
- seconds = self._dynamic_time(int(time_remain))
- if track_count == len(spotify_info):
- seconds = "0s"
- embed2.set_footer(
- text=_("Approximate time remaining: {seconds}").format(seconds=seconds)
- )
- try:
- await playlist_msg.edit(embed=embed2)
- except discord.errors.NotFound:
- pass
+ elif playlist.scope == PlaylistScope.GUILD.value and (
+ is_different_guild or dj_enabled
+ ):
+ msg = _(
+ "You do not have the permissions to manage that playlist in {guild}."
+ ).format(guild=guild_to_query)
+ elif (
+ playlist.scope in [PlaylistScope.GUILD.value, PlaylistScope.USER.value]
+ and is_different_user
+ ):
+ msg = _(
+ "You do not have the permissions to manage playlist owned by {user}."
+ ).format(user=playlist_author)
+ else:
+ msg = _(
+ "You do not have the permissions to manage "
+ "playlists in {scope} scope.".format(scope=humanize_scope(scope, the=True))
+ )
- if len(track_list) == 0:
- embed3 = discord.Embed(
- colour=await ctx.embed_colour(),
- title=_(
- "Nothing found.\nThe YouTube API key may be invalid "
- "or you may be rate limited on YouTube's search service.\n"
- "Check the YouTube API key again and follow the instructions "
- "at `{prefix}audioset youtubeapi`."
- ).format(prefix=ctx.prefix),
+ await self._embed_msg(ctx, msg)
+ return False
+ return True
+
+ async def _get_correct_playlist_id(
+ self,
+ context: commands.Context,
+ matches: dict,
+ scope: str,
+ author: discord.User,
+ guild: discord.Guild,
+ specified_user: bool = False,
+ ) -> Tuple[Optional[int], str]:
+ """
+ Parameters
+ ----------
+ context: commands.Context
+ The context in which this is being called.
+ matches: dict
+ A dict of the matches found where key is scope and value is matches.
+ scope:str
+ The custom config scope. A value from :code:`PlaylistScope`.
+ author: discord.User
+ The user.
+ guild: discord.Guild
+ The guild.
+ specified_user: bool
+ Whether or not a user ID was specified via argparse.
+ Returns
+ -------
+ Tuple[Optional[int], str]
+ Tuple of Playlist ID or None if none found and original user input.
+ Raises
+ ------
+ `TooManyMatches`
+ When more than 10 matches are found or
+ When multiple matches are found but none is selected.
+
+ """
+ original_input = matches.get("arg")
+ correct_scope_matches = matches.get(scope)
+ guild_to_query = guild.id
+ user_to_query = author.id
+ if not correct_scope_matches:
+ return None, original_input
+ if scope == PlaylistScope.USER.value:
+ correct_scope_matches = [
+ (i[2]["id"], i[2]["name"], len(i[2]["tracks"]), i[2]["author"])
+ for i in correct_scope_matches
+ if str(user_to_query) == i[0]
+ ]
+ elif scope == PlaylistScope.GUILD.value:
+ if specified_user:
+ correct_scope_matches = [
+ (i[2]["id"], i[2]["name"], len(i[2]["tracks"]), i[2]["author"])
+ for i in correct_scope_matches
+ if str(guild_to_query) == i[0] and i[2]["author"] == user_to_query
+ ]
+ else:
+ correct_scope_matches = [
+ (i[2]["id"], i[2]["name"], len(i[2]["tracks"]), i[2]["author"])
+ for i in correct_scope_matches
+ if str(guild_to_query) == i[0]
+ ]
+ else:
+ if specified_user:
+ correct_scope_matches = [
+ (i[2]["id"], i[2]["name"], len(i[2]["tracks"]), i[2]["author"])
+ for i in correct_scope_matches
+ if i[2]["author"] == user_to_query
+ ]
+ else:
+ correct_scope_matches = [
+ (i[2]["id"], i[2]["name"], len(i[2]["tracks"]), i[2]["author"])
+ for i in correct_scope_matches
+ ]
+ match_count = len(correct_scope_matches)
+ # We done all the trimming we can with the info available time to ask the user
+ if match_count > 10:
+ if original_input.isnumeric():
+ arg = int(original_input)
+ correct_scope_matches = [
+ (i, n, t, a) for i, n, t, a in correct_scope_matches if i == arg
+ ]
+ if match_count > 10:
+ raise TooManyMatches(
+ f"{match_count} playlists match {original_input}: "
+ f"Please try to be more specific, or use the playlist ID."
+ )
+ elif match_count == 1:
+ return correct_scope_matches[0][0], original_input
+ elif match_count == 0:
+ return None, original_input
+
+ # TODO : Convert this section to a new paged reaction menu when Toby Menus are Merged
+ pos_len = 3
+ playlists = f"{'#':{pos_len}}\n"
+
+ for number, (pid, pname, ptracks, pauthor) in enumerate(correct_scope_matches, 1):
+ author = self.bot.get_user(pauthor) or "Unknown"
+ line = (
+ f"{number}."
+ f" <{pname}>\n"
+ f" - Scope: < {humanize_scope(scope)} >\n"
+ f" - ID: < {pid} >\n"
+ f" - Tracks: < {ptracks} >\n"
+ f" - Author: < {author} >\n\n"
)
- try:
- return await playlist_msg.edit(embed=embed3)
- except discord.errors.NotFound:
- pass
+ playlists += line
+
+ embed = discord.Embed(
+ title="Playlists found, which one would you like?",
+ description=box(playlists, lang="md"),
+ colour=await context.embed_colour(),
+ )
+ msg = await context.send(embed=embed)
+ avaliable_emojis = ReactionPredicate.NUMBER_EMOJIS[1:]
+ avaliable_emojis.append("🔟")
+ emojis = avaliable_emojis[: len(correct_scope_matches)]
+ emojis.append("❌")
+ start_adding_reactions(msg, emojis)
+ pred = ReactionPredicate.with_emojis(emojis, msg, user=context.author)
try:
- await playlist_msg.delete()
- except discord.errors.NotFound:
- pass
- return track_list
+ await context.bot.wait_for("reaction_add", check=pred, timeout=60)
+ except asyncio.TimeoutError:
+ with contextlib.suppress(discord.HTTPException):
+ await msg.delete()
+ raise TooManyMatches(
+ "Too many matches found and you did not select which one you wanted."
+ )
+ if emojis[pred.result] == "❌":
+ with contextlib.suppress(discord.HTTPException):
+ await msg.delete()
+ raise TooManyMatches(
+ "Too many matches found and you did not select which one you wanted."
+ )
+ with contextlib.suppress(discord.HTTPException):
+ await msg.delete()
+ return correct_scope_matches[pred.result][0], original_input
@commands.group()
@commands.guild_only()
- async def playlist(self, ctx):
- """Playlist configuration options."""
+ @commands.bot_has_permissions(embed_links=True)
+ async def playlist(self, ctx: commands.Context):
+ """Playlist configuration options.
+
+ Scope info:
+ **Global**:
+ Visible to all users of this bot.
+ Only editable by bot owner.
+ **Guild**:
+ Visible to all users in this guild.
+ Editable By Bot Owner, Guild Owner, Guild Admins,
+ Guild Mods, DJ Role and playlist creator.
+ **User**:
+ Visible to all bot users, if --author is passed.
+ Editable by bot owner and creator.
+
+ """
pass
- @playlist.command(name="append")
- async def _playlist_append(self, ctx, playlist_name, *, url):
+ @playlist.command(name="append", usage=" [args]")
+ async def _playlist_append(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ query: LazyGreedyConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
"""Add a track URL, playlist link, or quick search to a playlist.
The track(s) will be appended to the end of the playlist.
+
+ **Usage**:
+ [p]playlist append playlist_name_OR_id track_name_OR_url args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist append MyGuildPlaylist Hello by Adele
+ [p]playlist append MyGlobalPlaylist Hello by Adele --scope Global
+ [p]playlist append MyGlobalPlaylist Hello by Adele --scope Global
+ --Author Draper#6666
"""
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
if not await self._playlist_check(ctx):
return
- async with self.config.guild(ctx.guild).playlists() as playlists:
- try:
- if playlists[playlist_name][
- "author"
- ] != ctx.author.id and not await self._can_instaskip(ctx, ctx.author):
- return await self._embed_msg(
- ctx, _("You are not the author of that playlist.")
- )
- player = lavalink.get_player(ctx.guild.id)
- to_append = await self._playlist_tracks(ctx, player, url)
- if not to_append:
- return
- track_list = playlists[playlist_name]["tracks"]
- if track_list and len(to_append) == 1 and to_append[0] in track_list:
- return await self._embed_msg(
- ctx,
- _("{track} is already in {playlist}.").format(
- track=to_append[0]["info"]["title"], playlist=playlist_name
- ),
- )
- if track_list:
- playlists[playlist_name]["tracks"] = track_list + to_append
- else:
- playlists[playlist_name]["tracks"] = to_append
- except KeyError:
- return await self._embed_msg(ctx, _("No playlist with that name."))
- if playlists[playlist_name]["playlist_url"] is not None:
- playlists[playlist_name]["playlist_url"] = None
- if len(to_append) == 1:
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist").format(arg=playlist_arg)
+ )
+
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ if not await self.can_manage_playlist(scope, playlist, ctx, author, guild):
+ return
+ player = lavalink.get_player(ctx.guild.id)
+ to_append = await self._playlist_tracks(
+ ctx, player, dataclasses.Query.process_input(query)
+ )
+ if not to_append:
+ return await self._embed_msg(ctx, _("Could not find a track matching your query."))
+ track_list = playlist.tracks
+ tracks_obj_list = playlist.tracks_obj
+ to_append_count = len(to_append)
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ appended = 0
+
+ if to_append and to_append_count == 1:
+ to = lavalink.Track(to_append[0])
+ if to in tracks_obj_list:
+ return await self._embed_msg(
+ ctx,
+ _("{track} is already in {playlist} (`{id}`) [**{scope}**].").format(
+ track=to.title, playlist=playlist.name, id=playlist.id, scope=scope_name
+ ),
+ )
+ else:
+ appended += 1
+ if to_append and to_append_count > 1:
+ to_append_temp = []
+ for t in to_append:
+ to = lavalink.Track(t)
+ if to not in tracks_obj_list:
+ appended += 1
+ to_append_temp.append(t)
+ to_append = to_append_temp
+ if appended > 0:
+ track_list.extend(to_append)
+ update = {"tracks": track_list, "url": None}
+ await playlist.edit(update)
+
+ if to_append_count == 1 and appended == 1:
track_title = to_append[0]["info"]["title"]
return await self._embed_msg(
ctx,
- _("{track} appended to {playlist}.").format(
- track=track_title, playlist=playlist_name
+ _("{track} appended to {playlist} (`{id}`) [**{scope}**].").format(
+ track=track_title, playlist=playlist.name, id=playlist.id, scope=scope_name
),
)
- await self._embed_msg(
+
+ desc = _("{num} tracks appended to {playlist} (`{id}`) [**{scope}**].").format(
+ num=appended, playlist=playlist.name, id=playlist.id, scope=scope_name
+ )
+ if to_append_count > appended:
+ diff = to_append_count - appended
+ desc += _("\n{existing} {plural} already in the playlist and were skipped.").format(
+ existing=diff, plural=_("tracks are") if diff != 1 else _("track is")
+ )
+
+ embed = discord.Embed(
+ title=_("Playlist Modified"), colour=await ctx.embed_colour(), description=desc
+ )
+ await ctx.send(embed=embed)
+
+ @playlist.command(name="copy", usage=" [args]")
+ async def _playlist_copy(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ComplexScopeParser = None,
+ ):
+
+ """Copy a playlist from one scope to another.
+
+ **Usage**:
+ [p]playlist copy playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --from-scope
+ --from-author [user]
+ --from-guild [guild] **Only the bot owner can use this**
+
+ --to-scope
+ --to-author [user]
+ --to-guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist copy MyGuildPlaylist --from-scope Guild --to-scope Global
+ [p]playlist copy MyGlobalPlaylist --from-scope Global --to-author Draper#6666
+ --to-scope User
+ [p]playlist copy MyPersonalPlaylist --from-scope user --to-author Draper#6666
+ --to-scope Guild --to-guild Red - Discord Bot
+
+ """
+
+ if scope_data is None:
+ scope_data = [
+ PlaylistScope.GUILD.value,
+ ctx.author,
+ ctx.guild,
+ False,
+ PlaylistScope.GUILD.value,
+ ctx.author,
+ ctx.guild,
+ False,
+ ]
+ (
+ from_scope,
+ from_author,
+ from_guild,
+ specified_from_user,
+ to_scope,
+ to_author,
+ to_guild,
+ specified_to_user,
+ ) = scope_data
+
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, from_scope, from_author, from_guild, specified_from_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
+
+ temp_playlist = FakePlaylist(to_author.id, to_scope)
+ if not await self.can_manage_playlist(to_scope, temp_playlist, ctx, to_author, to_guild):
+ return
+
+ try:
+ from_playlist = await get_playlist(
+ playlist_id, from_scope, self.bot, from_guild, from_author.id
+ )
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(to_scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ to_playlist = await create_playlist(
ctx,
- _("{num} tracks appended to {playlist}.").format(
- num=len(to_append), playlist=playlist_name
+ to_scope,
+ from_playlist.name,
+ from_playlist.url,
+ from_playlist.tracks,
+ to_author,
+ to_guild,
+ )
+ if to_scope == PlaylistScope.GLOBAL.value:
+ to_scope_name = "the Global"
+ elif to_scope == PlaylistScope.USER.value:
+ to_scope_name = to_author
+ else:
+ to_scope_name = to_guild
+
+ if from_scope == PlaylistScope.GLOBAL.value:
+ from_scope_name = "the Global"
+ elif from_scope == PlaylistScope.USER.value:
+ from_scope_name = from_author
+ else:
+ from_scope_name = from_guild
+
+ return await self._embed_msg(
+ ctx,
+ _(
+ "Playlist {name} (`{from_id}`) copied from {from_scope} to {to_scope} (`{to_id}`)."
+ ).format(
+ name=from_playlist.name,
+ from_id=from_playlist.id,
+ from_scope=humanize_scope(from_scope, ctx=from_scope_name, the=True),
+ to_scope=humanize_scope(to_scope, ctx=to_scope_name, the=True),
+ to_id=to_playlist.id,
),
)
- @checks.is_owner()
- @playlist.command(name="copy")
- async def _playlist_copy(self, ctx, playlist_name, from_server_id: int, to_server_id: int):
- """Copy a playlist from one server to another."""
- from_guild = self.bot.get_guild(from_server_id)
- to_guild = self.bot.get_guild(to_server_id)
- if not from_guild:
- return await self._embed_msg(ctx, _("Invalid server ID for source server."))
- if not to_guild:
- return await self._embed_msg(ctx, _("Invalid server ID for target server."))
- async with self.config.guild(from_guild).playlists() as from_playlists:
- if playlist_name not in from_playlists:
- return await self._embed_msg(
- ctx,
- _("No playlist with that name in {from_guild_name}.").format(
- from_guild_name=from_guild.name
- ),
- )
- async with self.config.guild(to_guild).playlists() as to_playlists:
- try:
- target_playlists = to_playlists[playlist_name]
- except KeyError:
- to_playlists[playlist_name] = from_playlists[playlist_name]
- return await self._embed_msg(
- ctx,
- _(
- "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
- ).format(
- name=playlist_name,
- from_guild_name=from_guild.name,
- to_guild_name=to_guild.name,
- ),
- )
+ @playlist.command(name="create", usage=" [args]")
+ async def _playlist_create(
+ self, ctx: commands.Context, playlist_name: str, *, scope_data: ScopeParser = None
+ ):
+ """Create an empty playlist.
- if target_playlists:
- await self._embed_msg(
- ctx,
- _(
- "A playlist with that name already exists in {to_guild_name}.\nPlease enter a new name for this playlist."
- ).format(to_guild_name=to_guild.name),
- )
- try:
- playlist_name_msg = await ctx.bot.wait_for(
- "message",
- timeout=15.0,
- check=MessagePredicate.regex(fr"^(?!{ctx.prefix})", ctx),
- )
- new_playlist_name = playlist_name_msg.content.split(" ")[0].strip('"')
- if len(new_playlist_name) > 20:
- return await self._embed_msg(
- ctx, _("Try the playlist copy command again with a shorter name.")
- )
- if new_playlist_name in to_playlists:
- return await self._embed_msg(
- ctx,
- _(
- "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
- ).format(to_guild_name=to_guild.name),
- )
- except asyncio.TimeoutError:
- return await self._embed_msg(
- ctx, _("No playlist name entered, try again later.")
- )
- to_playlists[new_playlist_name] = from_playlists[playlist_name]
- return await self._embed_msg(
- ctx,
- _(
- "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\nNew playlist name on {to_guild_name}: {new_name}"
- ).format(
- name=playlist_name,
- from_guild_name=from_guild.name,
- to_guild_name=to_guild.name,
- new_name=new_playlist_name,
- ),
- )
+ **Usage**:
+ [p]playlist create playlist_name args
- @playlist.command(name="create")
- async def _playlist_create(self, ctx, playlist_name):
- """Create an empty playlist."""
- dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
- if dj_enabled:
- if not await self._can_instaskip(ctx, ctx.author):
- return await self._embed_msg(ctx, _("You need the DJ role to save playlists."))
- async with self.config.guild(ctx.guild).playlists() as playlists:
- if playlist_name in playlists:
- return await self._embed_msg(
- ctx, _("Playlist name already exists, try again with a different name.")
- )
- playlist_name = playlist_name.split(" ")[0].strip('"')
- playlist_list = self._to_json(ctx, None, None)
- async with self.config.guild(ctx.guild).playlists() as playlists:
- playlists[playlist_name] = playlist_list
- await self._embed_msg(ctx, _("Empty playlist {name} created.").format(name=playlist_name))
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
- @playlist.command(name="delete")
- async def _playlist_delete(self, ctx, playlist_name):
- """Delete a saved playlist."""
- async with self.config.guild(ctx.guild).playlists() as playlists:
- try:
- if playlists[playlist_name][
- "author"
- ] != ctx.author.id and not await self._can_instaskip(ctx, ctx.author):
- return await self._embed_msg(
- ctx, _("You are not the author of that playlist.")
- )
- del playlists[playlist_name]
- except KeyError:
- return await self._embed_msg(ctx, _("No playlist with that name."))
- await self._embed_msg(ctx, _("{name} playlist deleted.").format(name=playlist_name))
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist create MyGuildPlaylist
+ [p]playlist create MyGlobalPlaylist --scope Global
+ [p]playlist create MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+
+ temp_playlist = FakePlaylist(author.id, scope)
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ if not await self.can_manage_playlist(scope, temp_playlist, ctx, author, guild):
+ return
+ playlist_name = playlist_name.split(" ")[0].strip('"')[:32]
+ if playlist_name.isnumeric():
+ return await self._embed_msg(
+ ctx,
+ _(
+ "Playlist names must be a single word (up to 32 "
+ "characters) and not numbers only."
+ ),
+ )
+ playlist = await create_playlist(ctx, scope, playlist_name, None, None, author, guild)
+ return await self._embed_msg(
+ ctx,
+ _("Empty playlist {name} (`{id}`) [**{scope}**] created.").format(
+ name=playlist.name, id=playlist.id, scope=scope_name
+ ),
+ )
+
+ @playlist.command(name="delete", aliases=["del"], usage=" [args]")
+ async def _playlist_delete(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Delete a saved playlist.
+
+ **Usage**:
+ [p]playlist delete playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist delete MyGuildPlaylist
+ [p]playlist delete MyGlobalPlaylist --scope Global
+ [p]playlist delete MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
+
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ if not await self.can_manage_playlist(scope, playlist, ctx, author, guild):
+ return
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ await delete_playlist(scope, playlist.id, guild or ctx.guild, author or ctx.author)
+
+ await self._embed_msg(
+ ctx,
+ _("{name} (`{id}`) [**{scope}**] playlist deleted.").format(
+ name=playlist.name, id=playlist.id, scope=scope_name
+ ),
+ )
+
+ @playlist.command(name="dedupe", usage=" [args]")
+ async def _playlist_remdupe(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Remove duplicate tracks from a saved playlist.
+
+ **Usage**:
+ [p]playlist dedupe playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist dedupe MyGuildPlaylist
+ [p]playlist dedupe MyGlobalPlaylist --scope Global
+ [p]playlist dedupe MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
+
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ if not await self.can_manage_playlist(scope, playlist, ctx, author, guild):
+ return
+
+ track_objects = playlist.tracks_obj
+ original_count = len(track_objects)
+ unique_tracks = set()
+ unique_tracks_add = unique_tracks.add
+ track_objects = [
+ x for x in track_objects if not (x in unique_tracks or unique_tracks_add(x))
+ ]
+
+ tracklist = []
+ for track in track_objects:
+ track_keys = track._info.keys()
+ track_values = track._info.values()
+ track_id = track.track_identifier
+ track_info = {}
+ for k, v in zip(track_keys, track_values):
+ track_info[k] = v
+ keys = ["track", "info"]
+ values = [track_id, track_info]
+ track_obj = {}
+ for key, value in zip(keys, values):
+ track_obj[key] = value
+ tracklist.append(track_obj)
+
+ final_count = len(tracklist)
+ if original_count - final_count != 0:
+ update = {"tracks": tracklist, "url": None}
+ await playlist.edit(update)
+
+ if original_count - final_count != 0:
+ await self._embed_msg(
+ ctx,
+ _(
+ "Removed {track_diff} duplicated "
+ "tracks from {name} (`{id}`) [**{scope}**] playlist."
+ ).format(
+ name=playlist.name,
+ id=playlist.id,
+ track_diff=original_count - final_count,
+ scope=scope_name,
+ ),
+ )
+ else:
+ await self._embed_msg(
+ ctx,
+ _("{name} (`{id}`) [**{scope}**] playlist has no duplicate tracks.").format(
+ name=playlist.name, id=playlist.id, scope=scope_name
+ ),
+ )
@checks.is_owner()
- @playlist.command(name="download")
- async def _playlist_download(self, ctx, playlist_name, v2=False):
+ @playlist.command(name="download", usage=" [v2=False] [args]")
+ @commands.bot_has_permissions(attach_files=True)
+ async def _playlist_download(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ v2: Optional[bool] = False,
+ *,
+ scope_data: ScopeParser = None,
+ ):
"""Download a copy of a playlist.
These files can be used with the [p]playlist upload command.
Red v2-compatible playlists can be generated by passing True
- for the v2 variable."""
- if not await self._playlist_check(ctx):
- return
- playlists = await self.config.guild(ctx.guild).playlists.get_raw()
- v2_valid_urls = ["https://www.youtube.com/watch?v=", "https://soundcloud.com/"]
- song_list = []
- playlist_url = None
+ for the v2 variable.
+
+ **Usage**:
+ [p]playlist download playlist_name_OR_id [v2=True_OR_False] args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist download MyGuildPlaylist True
+ [p]playlist download MyGlobalPlaylist False --scope Global
+ [p]playlist download MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
try:
- if playlists[playlist_name]["playlist_url"]:
- playlist_url = playlists[playlist_name]["playlist_url"]
- for track in playlists[playlist_name]["tracks"]:
- if v2:
- if track["info"]["uri"].startswith(tuple(v2_valid_urls)):
- song_list.append(track["info"]["uri"])
- else:
- song_list.append(track["info"]["uri"])
- except TypeError:
- return await self._embed_msg(ctx, _("That playlist has no tracks."))
- except KeyError:
- return await self._embed_msg(ctx, _("That playlist doesn't exist."))
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
- playlist_data = json.dumps(
- {"author": ctx.author.id, "link": playlist_url, "playlist": song_list}
- )
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ schema = 2
+ version = "v3" if v2 is False else "v2"
+
+ if not playlist.tracks:
+ return await self._embed_msg(ctx, _("That playlist has no tracks."))
+ if version == "v2":
+ v2_valid_urls = ["https://www.youtube.com/watch?v=", "https://soundcloud.com/"]
+ song_list = []
+ for track in playlist.tracks:
+ if track["info"]["uri"].startswith(tuple(v2_valid_urls)):
+ song_list.append(track["info"]["uri"])
+ playlist_data = {
+ "author": playlist.author,
+ "link": playlist.url,
+ "playlist": song_list,
+ "name": playlist.name,
+ }
+ file_name = playlist.name
+ else:
+ playlist_data = playlist.to_json()
+ playlist_songs_backwards_compatible = [
+ track["info"]["uri"] for track in playlist.tracks
+ ]
+ playlist_data[
+ "playlist"
+ ] = (
+ playlist_songs_backwards_compatible
+ ) # TODO: Keep new playlists backwards compatible, Remove me in a few releases
+ playlist_data[
+ "link"
+ ] = (
+ playlist.url
+ ) # TODO: Keep new playlists backwards compatible, Remove me in a few releases
+ file_name = playlist.id
+ playlist_data.update({"schema": schema, "version": version})
+ playlist_data = json.dumps(playlist_data)
to_write = StringIO()
to_write.write(playlist_data)
to_write.seek(0)
- await ctx.send(file=discord.File(to_write, filename=f"{playlist_name}.txt"))
+ await ctx.send(file=discord.File(to_write, filename=f"{file_name}.txt"))
to_write.close()
- @playlist.command(name="info")
- async def _playlist_info(self, ctx, playlist_name):
- """Retrieve information from a saved playlist."""
- playlists = await self.config.guild(ctx.guild).playlists.get_raw()
- try:
- author_id = playlists[playlist_name]["author"]
- except KeyError:
- return await self._embed_msg(ctx, _("No playlist with that name."))
+ @playlist.command(name="info", usage=" [args]")
+ async def _playlist_info(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Retrieve information from a saved playlist.
+
+ **Usage**:
+ [p]playlist info playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist info MyGuildPlaylist
+ [p]playlist info MyGlobalPlaylist --scope Global
+ [p]playlist info MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
try:
- track_len = len(playlists[playlist_name]["tracks"])
- except TypeError:
- track_len = 0
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
- msg = ""
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+ track_len = len(playlist.tracks)
+
+ msg = ""
track_idx = 0
if track_len > 0:
- for track in playlists[playlist_name]["tracks"]:
+ spaces = "\N{EN SPACE}" * (len(str(len(playlist.tracks))) + 2)
+ for track in playlist.tracks:
track_idx = track_idx + 1
- spaces = abs(len(str(track_idx)) - 5)
- msg += "`{}.` **[{}]({})**\n".format(
- track_idx, track["info"]["title"], track["info"]["uri"]
- )
+ query = dataclasses.Query.process_input(track["info"]["uri"])
+ if query.is_local:
+ if track["info"]["title"] != "Unknown title":
+ msg += "`{}.` **{} - {}**\n{}{}\n".format(
+ track_idx,
+ track["info"]["author"],
+ track["info"]["title"],
+ spaces,
+ query.to_string_user(),
+ )
+ else:
+ msg += "`{}.` {}\n".format(track_idx, query.to_string_user())
+ else:
+ msg += "`{}.` **[{}]({})**\n".format(
+ track_idx, track["info"]["title"], track["info"]["uri"]
+ )
+
else:
msg = "No tracks."
- playlist_url = playlists[playlist_name]["playlist_url"]
- if not playlist_url:
- embed_title = _("Playlist info for {playlist_name}:\n").format(
- playlist_name=playlist_name
+
+ if not playlist.url:
+ embed_title = _("Playlist info for {playlist_name} (`{id}`) [**{scope}**]:\n").format(
+ playlist_name=playlist.name, id=playlist.id, scope=scope_name
)
else:
- embed_title = _("Playlist info for {playlist_name}:\nURL: {url}").format(
- playlist_name=playlist_name, url=playlist_url
+ embed_title = _(
+ "Playlist info for {playlist_name} (`{id}`) [**{scope}**]:\nURL: {url}"
+ ).format(
+ playlist_name=playlist.name, url=playlist.url, id=playlist.id, scope=scope_name
)
page_list = []
- for page in pagify(msg, delims=["\n"], page_length=1000):
+ pages = list(pagify(msg, delims=["\n"], page_length=2000))
+ total_pages = len(pages)
+ for numb, page in enumerate(pages, start=1):
embed = discord.Embed(
colour=await ctx.embed_colour(), title=embed_title, description=page
)
- author_obj = self.bot.get_user(author_id)
+ author_obj = self.bot.get_user(playlist.author)
embed.set_footer(
- text=_("Author: {author_name} | {num} track(s)").format(
- author_name=author_obj, num=track_len
+ text=_("Page {page}/{pages} | Author: {author_name} | {num} track(s)").format(
+ author_name=author_obj, num=track_len, pages=total_pages, page=numb
)
)
page_list.append(embed)
await menu(ctx, page_list, DEFAULT_CONTROLS)
- @playlist.command(name="list")
- async def _playlist_list(self, ctx):
- """List saved playlists."""
- playlists = await self.config.guild(ctx.guild).playlists.get_raw()
- if not playlists:
- return await self._embed_msg(ctx, _("No saved playlists."))
+ @playlist.command(name="list", usage="[args]")
+ @commands.bot_has_permissions(add_reactions=True)
+ async def _playlist_list(self, ctx: commands.Context, *, scope_data: ScopeParser = None):
+ """List saved playlists.
+
+ **Usage**:
+ [p]playlist list args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist list
+ [p]playlist list --scope Global
+ [p]playlist list --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+
+ try:
+ playlists = await get_all_playlist(scope, self.bot, guild, author, specified_user)
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ if scope == PlaylistScope.GUILD.value:
+ name = f"{guild.name}"
+ elif scope == PlaylistScope.USER.value:
+ name = f"{author}"
+ else:
+ name = "the global scope"
+
+ if not playlists and specified_user:
+ return await self._embed_msg(
+ ctx,
+ _("No saved playlists for {scope} created by {author}.").format(
+ scope=name, author=author
+ ),
+ )
+ elif not playlists:
+ return await self._embed_msg(
+ ctx, _("No saved playlists for {scope}.").format(scope=name)
+ )
+
playlist_list = []
space = "\N{EN SPACE}"
- for playlist_name in playlists:
- tracks = playlists[playlist_name]["tracks"]
- if not tracks:
- tracks = []
- author = playlists[playlist_name]["author"]
+ for playlist in playlists:
playlist_list.append(
("\n" + space * 4).join(
(
- bold(playlist_name),
- _("Tracks: {num}").format(num=len(tracks)),
- _("Author: {name}\n").format(name=self.bot.get_user(author)),
+ bold(playlist.name),
+ _("ID: {id}").format(id=playlist.id),
+ _("Tracks: {num}").format(num=len(playlist.tracks)),
+ _("Author: {name}\n").format(name=self.bot.get_user(playlist.author)),
)
)
)
abc_names = sorted(playlist_list, key=str.lower)
len_playlist_list_pages = math.ceil(len(abc_names) / 5)
playlist_embeds = []
+
for page_num in range(1, len_playlist_list_pages + 1):
- embed = await self._build_playlist_list_page(ctx, page_num, abc_names)
+ embed = await self._build_playlist_list_page(ctx, page_num, abc_names, name)
playlist_embeds.append(embed)
await menu(ctx, playlist_embeds, DEFAULT_CONTROLS)
- async def _build_playlist_list_page(self, ctx, page_num, abc_names):
+ @staticmethod
+ async def _build_playlist_list_page(ctx: commands.Context, page_num, abc_names, scope):
plist_num_pages = math.ceil(len(abc_names) / 5)
plist_idx_start = (page_num - 1) * 5
plist_idx_end = plist_idx_start + 5
@@ -1814,180 +4136,607 @@ class Audio(commands.Cog):
plist += "`{}.` {}".format(item_idx, playlist_info)
embed = discord.Embed(
colour=await ctx.embed_colour(),
- title=_("Playlists for {server_name}:").format(server_name=ctx.guild.name),
+ title=_("Playlists for {scope}:").format(scope=scope),
description=plist,
)
embed.set_footer(
- text=_("Page {page_num}/{total_pages} | {num} playlists").format(
+ text=_("Page {page_num}/{total_pages} | {num} playlists.").format(
page_num=page_num, total_pages=plist_num_pages, num=len(abc_names)
)
)
return embed
- @commands.cooldown(1, 15, discord.ext.commands.BucketType.guild)
- @playlist.command(name="queue")
- async def _playlist_queue(self, ctx, playlist_name=None):
- """Save the queue to a playlist."""
- dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
- if dj_enabled:
- if not await self._can_instaskip(ctx, ctx.author):
- return await self._embed_msg(ctx, _("You need the DJ role to save playlists."))
- async with self.config.guild(ctx.guild).playlists() as playlists:
- if playlist_name in playlists:
- return await self._embed_msg(
- ctx, _("Playlist name already exists, try again with a different name.")
- )
- if not self._player_check(ctx):
- return await self._embed_msg(ctx, _("Nothing playing."))
+ @commands.cooldown(1, 15, commands.BucketType.guild)
+ @playlist.command(name="queue", usage=" [args]")
+ async def _playlist_queue(
+ self, ctx: commands.Context, playlist_name: str, *, scope_data: ScopeParser = None
+ ):
+ """Save the queue to a playlist.
+
+ **Usage**:
+ [p]playlist queue playlist_name
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist queue MyGuildPlaylist
+ [p]playlist queue MyGlobalPlaylist --scope Global
+ [p]playlist queue MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ temp_playlist = FakePlaylist(author.id, scope)
+ if not await self.can_manage_playlist(scope, temp_playlist, ctx, author, guild):
+ return
+ playlist_name = playlist_name.split(" ")[0].strip('"')[:32]
+ if playlist_name.isnumeric():
+ return await self._embed_msg(
+ ctx,
+ _(
+ "Playlist names must be a single word "
+ "(up to 32 characters) and not numbers only."
+ ),
+ )
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("Nothing playing."))
+
player = lavalink.get_player(ctx.guild.id)
- if not player.current:
+ if not player.queue:
return await self._embed_msg(ctx, _("There's nothing in the queue."))
tracklist = []
- np_song = self._track_creator(player, "np")
+ np_song = track_creator(player, "np")
tracklist.append(np_song)
for track in player.queue:
queue_idx = player.queue.index(track)
- track_obj = self._track_creator(player, queue_idx)
+ track_obj = track_creator(player, queue_idx)
tracklist.append(track_obj)
- if not playlist_name:
- await self._embed_msg(ctx, _("Please enter a name for this playlist."))
- try:
- playlist_name_msg = await ctx.bot.wait_for(
- "message",
- timeout=15.0,
- check=MessagePredicate.regex(fr"^(?!{ctx.prefix})", ctx),
- )
- playlist_name = playlist_name_msg.content.split(" ")[0].strip('"')
- if len(playlist_name) > 20:
- return await self._embed_msg(
- ctx, _("Try the command again with a shorter name.")
- )
- if playlist_name in playlists:
- return await self._embed_msg(
- ctx, _("Playlist name already exists, try again with a different name.")
- )
- except asyncio.TimeoutError:
- return await self._embed_msg(ctx, _("No playlist name entered, try again later."))
- playlist_list = self._to_json(ctx, None, tracklist)
- async with self.config.guild(ctx.guild).playlists() as playlists:
- playlist_name = playlist_name.split(" ")[0].strip('"')
- playlists[playlist_name] = playlist_list
+ playlist = await create_playlist(ctx, scope, playlist_name, None, tracklist, author, guild)
await self._embed_msg(
ctx,
- _("Playlist {name} saved from current queue: {num} tracks added.").format(
- name=playlist_name.split(" ")[0].strip('"'), num=len(tracklist)
+ _(
+ "Playlist {name} (`{id}`) [**{scope}**] saved "
+ "from current queue: {num} tracks added."
+ ).format(
+ name=playlist.name, num=len(playlist.tracks), id=playlist.id, scope=scope_name
),
)
- @playlist.command(name="remove")
- async def _playlist_remove(self, ctx, playlist_name, url):
- """Remove a track from a playlist by url."""
- async with self.config.guild(ctx.guild).playlists() as playlists:
- try:
- if playlists[playlist_name][
- "author"
- ] != ctx.author.id and not await self._can_instaskip(ctx, ctx.author):
- return await self._embed_msg(
- ctx, _("You are not the author of that playlist.")
- )
- except KeyError:
- return await self._embed_msg(ctx, _("No playlist with that name."))
- track_list = playlists[playlist_name]["tracks"]
- clean_list = [track for track in track_list if not url == track["info"]["uri"]]
- if len(playlists[playlist_name]["tracks"]) == len(clean_list):
- return await self._embed_msg(ctx, _("URL not in playlist."))
- del_count = len(playlists[playlist_name]["tracks"]) - len(clean_list)
- if not clean_list:
- del playlists[playlist_name]
- return await self._embed_msg(ctx, _("No tracks left, removing playlist."))
- playlists[playlist_name]["tracks"] = clean_list
- if playlists[playlist_name]["playlist_url"] is not None:
- playlists[playlist_name]["playlist_url"] = None
+ @playlist.command(name="remove", usage=" [args]")
+ async def _playlist_remove(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ url: str,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Remove a track from a playlist by url.
+
+ **Usage**:
+ [p]playlist remove playlist_name_OR_id url args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist remove MyGuildPlaylist https://www.youtube.com/watch?v=MN3x-kAbgFU
+ [p]playlist remove MyGlobalPlaylist https://www.youtube.com/watch?v=MN3x-kAbgFU
+ --scope Global
+ [p]playlist remove MyPersonalPlaylist https://www.youtube.com/watch?v=MN3x-kAbgFU
+ --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
+
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ if not await self.can_manage_playlist(scope, playlist, ctx, author, guild):
+ return
+
+ track_list = playlist.tracks
+ clean_list = [track for track in track_list if url != track["info"]["uri"]]
+ if len(track_list) == len(clean_list):
+ return await self._embed_msg(ctx, _("URL not in playlist."))
+ del_count = len(track_list) - len(clean_list)
+ if not clean_list:
+ await delete_playlist(
+ scope=playlist.scope, playlist_id=playlist.id, guild=guild, author=playlist.author
+ )
+ return await self._embed_msg(ctx, _("No tracks left, removing playlist."))
+ update = {"tracks": clean_list, "url": None}
+ await playlist.edit(update)
if del_count > 1:
await self._embed_msg(
ctx,
- _("{num} entries have been removed from the {playlist_name} playlist.").format(
- num=del_count, playlist_name=playlist_name
+ _(
+ "{num} entries have been removed from the"
+ " playlist {playlist_name} (`{id}`) [**{scope}**]."
+ ).format(
+ num=del_count, playlist_name=playlist.name, id=playlist.id, scope=scope_name
),
)
else:
await self._embed_msg(
ctx,
- _("The track has been removed from the {playlist_name} playlist.").format(
- playlist_name=playlist_name
- ),
+ _(
+ "The track has been removed from the"
+ " playlist: {playlist_name} (`{id}`) [**{scope}**]."
+ ).format(playlist_name=playlist.name, id=playlist.id, scope=scope_name),
)
- @playlist.command(name="save")
- async def _playlist_save(self, ctx, playlist_name, playlist_url):
- """Save a playlist from a url."""
+ @playlist.command(name="save", usage=" [args]")
+ async def _playlist_save(
+ self,
+ ctx: commands.Context,
+ playlist_name: str,
+ playlist_url: str,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Save a playlist from a url.
+
+ **Usage**:
+ [p]playlist save name url args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist save MyGuildPlaylist
+ https://www.youtube.com/playlist?list=PLx0sYbCqOb8Q_CLZC2BdBSKEEB59BOPUM
+ [p]playlist save MyGlobalPlaylist
+ https://www.youtube.com/playlist?list=PLx0sYbCqOb8Q_CLZC2BdBSKEEB59BOPUM --scope Global
+ [p]playlist save MyPersonalPlaylist
+ https://open.spotify.com/playlist/1RyeIbyFeIJVnNzlGr5KkR --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+
+ temp_playlist = FakePlaylist(author.id, scope)
+ if not await self.can_manage_playlist(scope, temp_playlist, ctx, author, guild):
+ return
+ playlist_name = playlist_name.split(" ")[0].strip('"')[:32]
+ if playlist_name.isnumeric():
+ return await self._embed_msg(
+ ctx,
+ _(
+ "Playlist names must be a single word (up to 32 "
+ "characters) and not numbers only."
+ ),
+ )
if not await self._playlist_check(ctx):
return
player = lavalink.get_player(ctx.guild.id)
- tracklist = await self._playlist_tracks(ctx, player, playlist_url)
- playlist_list = self._to_json(ctx, playlist_url, tracklist)
+ tracklist = await self._playlist_tracks(
+ ctx, player, dataclasses.Query.process_input(playlist_url)
+ )
if tracklist is not None:
- async with self.config.guild(ctx.guild).playlists() as playlists:
- playlist_name = playlist_name.split(" ")[0].strip('"')
- playlists[playlist_name] = playlist_list
- return await self._embed_msg(
- ctx,
- _("Playlist {name} saved: {num} tracks added.").format(
- name=playlist_name, num=len(tracklist)
- ),
- )
+ playlist = await create_playlist(
+ ctx, scope, playlist_name, playlist_url, tracklist, author, guild
+ )
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {name} (`{id}`) [**{scope}**] saved: {num} tracks added.").format(
+ name=playlist.name, num=len(tracklist), id=playlist.id, scope=scope_name
+ ),
+ )
+
+ @playlist.command(name="start", usage=" [args]")
+ async def _playlist_start(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Load a playlist into the queue.
+
+ **Usage**:
+ [p]playlist start playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist start MyGuildPlaylist
+ [p]playlist start MyGlobalPlaylist --scope Global
+ [p]playlist start MyPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author):
+ await self._embed_msg(ctx, _("You need the DJ role to start playing playlists."))
+ return False
+
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist").format(arg=playlist_arg)
+ )
- @playlist.command(name="start")
- async def _playlist_start(self, ctx, playlist_name=None):
- """Load a playlist into the queue."""
if not await self._playlist_check(ctx):
return
+ jukebox_price = await self.config.guild(ctx.guild).jukebox_price()
+ if not await self._currency_check(ctx, jukebox_price):
+ return
maxlength = await self.config.guild(ctx.guild).maxlength()
- playlists = await self.config.guild(ctx.guild).playlists.get_raw()
author_obj = self.bot.get_user(ctx.author.id)
track_len = 0
+ playlist = None
try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
player = lavalink.get_player(ctx.guild.id)
- for track in playlists[playlist_name]["tracks"]:
- if track["info"]["uri"].startswith("localtracks/"):
+ tracks = playlist.tracks_obj
+ empty_queue = not player.queue
+ for track in tracks:
+ if not await is_allowed(
+ ctx.guild,
+ (
+ f"{track.title} {track.author} {track.uri} "
+ f"{str(dataclasses.Query.process_input(track))}"
+ ),
+ ):
+ log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
+ continue
+ query = dataclasses.Query.process_input(track.uri)
+ if query.is_local:
+ local_path = dataclasses.LocalPath(track.uri)
if not await self._localtracks_check(ctx):
pass
- if not os.path.isfile(track["info"]["uri"]):
+ if not local_path.exists() and not local_path.is_file():
continue
if maxlength > 0:
- if not self._track_limit(ctx, track["info"]["length"], maxlength):
+ if not track_limit(track.length, maxlength):
continue
- player.add(author_obj, lavalink.rest_api.Track(data=track))
+
+ player.add(author_obj, track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, track, ctx.author
+ )
track_len += 1
- if len(playlists[playlist_name]["tracks"]) > track_len:
+ player.maybe_shuffle(0 if empty_queue else 1)
+ if len(tracks) > track_len:
maxlength_msg = " {bad_tracks} tracks cannot be queued.".format(
- bad_tracks=(len(playlists[playlist_name]["tracks"]) - track_len)
+ bad_tracks=(len(tracks) - track_len)
)
else:
maxlength_msg = ""
+ if scope == PlaylistScope.GUILD.value:
+ scope_name = f"{guild.name}"
+ elif scope == PlaylistScope.USER.value:
+ scope_name = f"{author}"
+ else:
+ scope_name = "the global scope"
+
embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("Playlist Enqueued"),
- description=_("Added {num} tracks to the queue.{maxlength_msg}").format(
- num=track_len, maxlength_msg=maxlength_msg
+ description=_(
+ "{name} - (`{id}`) [**{scope}**]\nAdded {num} "
+ "tracks to the queue.{maxlength_msg}"
+ ).format(
+ num=track_len,
+ maxlength_msg=maxlength_msg,
+ name=playlist.name,
+ id=playlist.id,
+ scope=scope_name,
),
)
await ctx.send(embed=embed)
if not player.current:
await player.play()
+ return
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
except TypeError:
- await ctx.invoke(self.play, query=playlists[playlist_name]["playlist_url"])
- except KeyError:
- await self._embed_msg(ctx, _("That playlist doesn't exist."))
+ if playlist:
+ return await ctx.invoke(self.play, query=playlist.url)
+
+ @playlist.command(name="update", usage=" [args]")
+ async def _playlist_update(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Updates all tracks in a playlist.
+
+ **Usage**:
+ [p]playlist update playlist_name_OR_id args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist update MyGuildPlaylist
+ [p]playlist update MyGlobalPlaylist --scope Global
+ [p]playlist update MyPersonalPlaylist --scope User
+ """
+
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
+
+ if not await self._playlist_check(ctx):
+ return
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ if not await self.can_manage_playlist(scope, playlist, ctx, author, guild):
+ return
+ if playlist.url:
+ player = lavalink.get_player(ctx.guild.id)
+ added, removed, playlist = await self._maybe_update_playlist(ctx, player, playlist)
+ else:
+ return await self._embed_msg(ctx, _("Custom playlists cannot be updated."))
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+ else:
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ if added or removed:
+ _colour = await ctx.embed_colour()
+ embeds = []
+ total_added = len(added)
+ total_removed = len(removed)
+ total_pages = math.ceil(total_removed / 10) + math.ceil(total_added / 10)
+ page_count = 0
+ if removed:
+ removed_text = ""
+ for i, track in enumerate(removed, 1):
+ if len(track.title) > 40:
+ track_title = str(track.title).replace("[", "")
+ track_title = "{}...".format((track_title[:40]).rstrip(" "))
+ else:
+ track_title = track.title
+ removed_text += f"`{i}.` **[{track_title}]({track.uri})**\n"
+ if i % 10 == 0 or i == total_removed:
+ page_count += 1
+ embed = discord.Embed(
+ title=_("Tracks removed"), colour=_colour, description=removed_text
+ )
+ text = _("Page {page_num}/{total_pages}").format(
+ page_num=page_count, total_pages=total_pages
+ )
+ embed.set_footer(text=text)
+ embeds.append(embed)
+ removed_text = ""
+ if added:
+ added_text = ""
+ for i, track in enumerate(added, 1):
+ if len(track.title) > 40:
+ track_title = str(track.title).replace("[", "")
+ track_title = "{}...".format((track_title[:40]).rstrip(" "))
+ else:
+ track_title = track.title
+ added_text += f"`{i}.` **[{track_title}]({track.uri})**\n"
+ if i % 10 == 0 or i == total_added:
+ page_count += 1
+ embed = discord.Embed(
+ title=_("Tracks added"), colour=_colour, description=added_text
+ )
+ text = _("Page {page_num}/{total_pages}").format(
+ page_num=page_count, total_pages=total_pages
+ )
+ embed.set_footer(text=text)
+ embeds.append(embed)
+ added_text = ""
+ await menu(ctx, embeds, DEFAULT_CONTROLS)
+ else:
+ return await self._embed_msg(
+ ctx,
+ _("No changes for {name} (`{id}`) [**{scope}**].").format(
+ id=playlist.id, name=playlist.name, scope=scope_name
+ ),
+ )
@checks.is_owner()
- @playlist.command(name="upload")
- async def _playlist_upload(self, ctx):
- """Convert a Red v2 playlist file to a playlist."""
+ @playlist.command(name="upload", usage="[args]")
+ async def _playlist_upload(self, ctx: commands.Context, *, scope_data: ScopeParser = None):
+ """Uploads a playlist file as a playlist for the bot.
+
+ V2 and old V3 playlist will be slow.
+ V3 Playlist made with [p]playlist download will load a lot faster.
+
+ **Usage**:
+ [p]playlist upload args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist upload
+ [p]playlist upload --scope Global
+ [p]playlist upload --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+ temp_playlist = FakePlaylist(author.id, scope)
+ if not await self.can_manage_playlist(scope, temp_playlist, ctx, author, guild):
+ return
+
if not await self._playlist_check(ctx):
return
player = lavalink.get_player(ctx.guild.id)
+
await self._embed_msg(
ctx,
_("Please upload the playlist file. Any other message will cancel this operation."),
@@ -2003,96 +4752,328 @@ class Audio(commands.Cog):
file_url = file_message.attachments[0].url
except IndexError:
return await self._embed_msg(ctx, _("Upload cancelled."))
- v2_playlist_name = (file_url.split("/")[6]).split(".")[0]
file_suffix = file_url.rsplit(".", 1)[1]
if file_suffix != "txt":
return await self._embed_msg(ctx, _("Only playlist files can be uploaded."))
try:
async with self.session.request("GET", file_url) as r:
- v2_playlist = await r.json(content_type="text/plain")
+ uploaded_playlist = await r.json(content_type="text/plain")
except UnicodeDecodeError:
return await self._embed_msg(ctx, _("Not a valid playlist file."))
- try:
- v2_playlist_url = v2_playlist["link"]
- except KeyError:
- v2_playlist_url = None
- if (
- not v2_playlist_url
- or not self._match_yt_playlist(v2_playlist_url)
- or not await player.get_tracks(v2_playlist_url)
- ):
- track_list = []
- track_count = 0
- async with self.config.guild(ctx.guild).playlists() as v3_playlists:
- try:
- if v3_playlists[v2_playlist_name]:
- return await self._embed_msg(
- ctx, _("A playlist already exists with this name.")
- )
- except KeyError:
- pass
- embed1 = discord.Embed(
- colour=await ctx.embed_colour(), title=_("Please wait, adding tracks...")
- )
- playlist_msg = await ctx.send(embed=embed1)
- for song_url in v2_playlist["playlist"]:
- try:
- track = await player.get_tracks(song_url)
- except RuntimeError:
- pass
- try:
- track_obj = self._track_creator(player, other_track=track[0])
- track_list.append(track_obj)
- track_count = track_count + 1
- except IndexError:
- pass
- if track_count % 5 == 0:
- embed2 = discord.Embed(
- colour=await ctx.embed_colour(),
- title=_("Loading track {num}/{total}...").format(
- num=track_count, total=len(v2_playlist["playlist"])
- ),
- )
- await playlist_msg.edit(embed=embed2)
- if not track_list:
- return await self._embed_msg(ctx, _("No tracks found."))
- playlist_list = self._to_json(ctx, v2_playlist_url, track_list)
- async with self.config.guild(ctx.guild).playlists() as v3_playlists:
- v3_playlists[v2_playlist_name] = playlist_list
- if len(v2_playlist["playlist"]) != track_count:
- bad_tracks = len(v2_playlist["playlist"]) - track_count
- msg = _(
- "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) "
- "could not be loaded."
- ).format(num=track_count, playlist_name=v2_playlist_name, num_bad=bad_tracks)
- else:
- msg = _("Added {num} tracks from the {playlist_name} playlist.").format(
- num=track_count, playlist_name=v2_playlist_name
- )
- embed3 = discord.Embed(
- colour=await ctx.embed_colour(), title=_("Playlist Saved"), description=msg
- )
- await playlist_msg.edit(embed=embed3)
- else:
- await ctx.invoke(self._playlist_save, v2_playlist_name, v2_playlist_url)
- async def _playlist_check(self, ctx):
- dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
- jukebox_price = await self.config.guild(ctx.guild).jukebox_price()
- if dj_enabled:
- if not await self._can_instaskip(ctx, ctx.author):
- await self._embed_msg(ctx, _("You need the DJ role to use playlists."))
- return False
+ new_schema = uploaded_playlist.get("schema", 1) >= 2
+ version = uploaded_playlist.get("version", "v2")
+
+ if new_schema and version == "v3":
+ uploaded_playlist_url = uploaded_playlist.get("playlist_url", None)
+ track_list = uploaded_playlist.get("tracks", [])
+ else:
+ uploaded_playlist_url = uploaded_playlist.get("link", None)
+ track_list = uploaded_playlist.get("playlist", [])
+
+ uploaded_playlist_name = uploaded_playlist.get(
+ "name", (file_url.split("/")[6]).split(".")[0]
+ )
+ if (
+ not uploaded_playlist_url
+ or not match_yt_playlist(uploaded_playlist_url)
+ or not (
+ await self.music_cache.lavalink_query(
+ ctx, player, dataclasses.Query.process_input(uploaded_playlist_url)
+ )
+ )[0].tracks
+ ):
+ if version == "v3":
+ return await self._load_v3_playlist(
+ ctx,
+ scope,
+ uploaded_playlist_name,
+ uploaded_playlist_url,
+ track_list,
+ author,
+ guild,
+ )
+ return await self._load_v2_playlist(
+ ctx,
+ track_list,
+ player,
+ uploaded_playlist_url,
+ uploaded_playlist_name,
+ scope,
+ author,
+ guild,
+ )
+ return await ctx.invoke(
+ self._playlist_save,
+ playlist_name=uploaded_playlist_name,
+ playlist_url=uploaded_playlist_url,
+ scope_data=(scope, author, guild, specified_user),
+ )
+
+ @playlist.command(name="rename", usage=" [args]")
+ async def _playlist_rename(
+ self,
+ ctx: commands.Context,
+ playlist_matches: PlaylistConverter,
+ new_name: str,
+ *,
+ scope_data: ScopeParser = None,
+ ):
+ """Rename an existing playlist.
+
+ **Usage**:
+ [p]playlist rename playlist_name_OR_id new_name args
+
+ **Args**:
+ The following are all optional:
+ --scope
+ --author [user]
+ --guild [guild] **Only the bot owner can use this**
+
+ Scope is one of the following:
+ Global
+ Guild
+ User
+
+ Author can be one of the following:
+ User ID
+ User Mention
+ User Name#123
+
+ Guild can be one of the following:
+ Guild ID
+ Exact guild name
+
+ Example use:
+ [p]playlist rename MyGuildPlaylist RenamedGuildPlaylist
+ [p]playlist rename MyGlobalPlaylist RenamedGlobalPlaylist --scope Global
+ [p]playlist rename MyPersonalPlaylist RenamedPersonalPlaylist --scope User
+ """
+ if scope_data is None:
+ scope_data = [PlaylistScope.GUILD.value, ctx.author, ctx.guild, False]
+ scope, author, guild, specified_user = scope_data
+
+ new_name = new_name.split(" ")[0].strip('"')[:32]
+ if new_name.isnumeric():
+ return await self._embed_msg(
+ ctx,
+ _(
+ "Playlist names must be a single word (up to 32 "
+ "characters) and not numbers only."
+ ),
+ )
+
+ try:
+ playlist_id, playlist_arg = await self._get_correct_playlist_id(
+ ctx, playlist_matches, scope, author, guild, specified_user
+ )
+ except TooManyMatches as e:
+ return await self._embed_msg(ctx, str(e))
+ if playlist_id is None:
+ return await self._embed_msg(
+ ctx, _("Could not match '{arg}' to a playlist.").format(arg=playlist_arg)
+ )
+
+ try:
+ playlist = await get_playlist(playlist_id, scope, self.bot, guild, author)
+ except RuntimeError:
+ return await self._embed_msg(
+ ctx,
+ _("Playlist {id} does not exist in {scope} scope.").format(
+ id=playlist_id, scope=humanize_scope(scope, the=True)
+ ),
+ )
+ except MissingGuild:
+ return await self._embed_msg(
+ ctx, _("You need to specify the Guild ID for the guild to lookup.")
+ )
+
+ if not await self.can_manage_playlist(scope, playlist, ctx, author, guild):
+ return
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ old_name = playlist.name
+ update = {"name": new_name}
+ await playlist.edit(update)
+ msg = _("'{old}' playlist has been renamed to '{new}' (`{id}`) [**{scope}**]").format(
+ old=bold(old_name), new=bold(playlist.name), id=playlist.id, scope=scope_name
+ )
+ await self._embed_msg(ctx, msg)
+
+ async def _load_v3_playlist(
+ self,
+ ctx: commands.Context,
+ scope: str,
+ uploaded_playlist_name: str,
+ uploaded_playlist_url: str,
+ track_list,
+ author: Union[discord.User, discord.Member],
+ guild: Union[discord.Guild],
+ ):
+ embed1 = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Please wait, adding tracks...")
+ )
+ playlist_msg = await ctx.send(embed=embed1)
+ track_count = len(track_list)
+ uploaded_track_count = len(track_list)
+ await asyncio.sleep(1)
+ embed2 = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("Loading track {num}/{total}...").format(
+ num=track_count, total=uploaded_track_count
+ ),
+ )
+ await playlist_msg.edit(embed=embed2)
+ playlist = await create_playlist(
+ ctx, scope, uploaded_playlist_name, uploaded_playlist_url, track_list, author, guild
+ )
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ if not track_count:
+ msg = _("Empty playlist {name} (`{id}`) [**{scope}**] created.").format(
+ name=playlist.name, id=playlist.id, scope=scope_name
+ )
+ elif uploaded_track_count != track_count:
+ bad_tracks = uploaded_track_count - track_count
+ msg = _(
+ "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) "
+ "could not be loaded."
+ ).format(num=track_count, playlist_name=playlist.name, num_bad=bad_tracks)
+ else:
+ msg = _("Added {num} tracks from the {playlist_name} playlist.").format(
+ num=track_count, playlist_name=playlist.name
+ )
+ embed3 = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Playlist Saved"), description=msg
+ )
+ await playlist_msg.edit(embed=embed3)
+ database_entries = []
+ time_now = str(datetime.datetime.now(datetime.timezone.utc))
+ for t in track_list:
+ uri = t.get("info", {}).get("uri")
+ if uri:
+ t = {"loadType": "V2_COMPAT", "tracks": [t], "query": uri}
+ database_entries.append(
+ {
+ "query": uri,
+ "data": json.dumps(t),
+ "last_updated": time_now,
+ "last_fetched": time_now,
+ }
+ )
+ if database_entries and HAS_SQL:
+ asyncio.ensure_future(self.music_cache.insert("lavalink", database_entries))
+
+ async def _load_v2_playlist(
+ self,
+ ctx: commands.Context,
+ uploaded_track_list,
+ player: lavalink.player_manager.Player,
+ playlist_url: str,
+ uploaded_playlist_name: str,
+ scope: str,
+ author: Union[discord.User, discord.Member],
+ guild: Union[discord.Guild],
+ ):
+ track_list = []
+ track_count = 0
+ successfull_count = 0
+ uploaded_track_count = len(uploaded_track_list)
+
+ embed1 = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Please wait, adding tracks...")
+ )
+ playlist_msg = await ctx.send(embed=embed1)
+ notifier = Notifier(ctx, playlist_msg, {"playlist": _("Loading track {num}/{total}...")})
+ for song_url in uploaded_track_list:
+ track_count += 1
+ try:
+ result, called_api = await self.music_cache.lavalink_query(
+ ctx, player, dataclasses.Query.process_input(song_url)
+ )
+ track = result.tracks
+ except Exception:
+ continue
+ try:
+ track_obj = track_creator(player, other_track=track[0])
+ track_list.append(track_obj)
+ successfull_count += 1
+ except Exception:
+ continue
+ if (track_count % 2 == 0) or (track_count == len(uploaded_track_list)):
+ await notifier.notify_user(
+ current=track_count, total=len(uploaded_track_list), key="playlist"
+ )
+
+ playlist = await create_playlist(
+ ctx, scope, uploaded_playlist_name, playlist_url, track_list, author, guild
+ )
+ scope_name = humanize_scope(
+ scope, ctx=guild if scope == PlaylistScope.GUILD.value else author
+ )
+ if not successfull_count:
+ msg = _("Empty playlist {name} (`{id}`) [**{scope}**] created.").format(
+ name=playlist.name, id=playlist.id, scope=scope_name
+ )
+ elif uploaded_track_count != successfull_count:
+ bad_tracks = uploaded_track_count - successfull_count
+ msg = _(
+ "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) "
+ "could not be loaded."
+ ).format(num=successfull_count, playlist_name=playlist.name, num_bad=bad_tracks)
+ else:
+ msg = _("Added {num} tracks from the {playlist_name} playlist.").format(
+ num=successfull_count, playlist_name=playlist.name
+ )
+ embed3 = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Playlist Saved"), description=msg
+ )
+ await playlist_msg.edit(embed=embed3)
+
+ async def _maybe_update_playlist(
+ self, ctx: commands.Context, player: lavalink.player_manager.Player, playlist: Playlist
+ ) -> Tuple[List[lavalink.Track], List[lavalink.Track], Playlist]:
+ if playlist.url is None:
+ return [], [], playlist
+ results = {}
+ updated_tracks = await self._playlist_tracks(
+ ctx, player, dataclasses.Query.process_input(playlist.url)
+ )
+ if not updated_tracks:
+ # No Tracks available on url Lets set it to none to avoid repeated calls here
+ results["url"] = None
+ if updated_tracks: # Tracks have been updated
+ results["tracks"] = updated_tracks
+
+ old_tracks = playlist.tracks_obj
+ new_tracks = [lavalink.Track(data=track) for track in updated_tracks]
+ removed = list(set(old_tracks) - set(new_tracks))
+ added = list(set(new_tracks) - set(old_tracks))
+ if removed or added:
+ await playlist.edit(results)
+
+ return added, removed, playlist
+
+ async def _playlist_check(self, ctx: commands.Context):
if not self._player_check(ctx):
+ if self._connection_aborted:
+ msg = _("Connection to Lavalink has failed.")
+ if await ctx.bot.is_owner(ctx.author):
+ msg += " " + _("Please check your console or logs for details.")
+ await self._embed_msg(ctx, msg)
+ return False
try:
if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
- and self._userlimit(ctx.author.voice.channel)
+ and userlimit(ctx.author.voice.channel)
):
- return await self._embed_msg(
+ await self._embed_msg(
ctx, _("I don't have permission to connect to your channel.")
)
+ return False
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
@@ -2115,21 +5096,20 @@ class Audio(commands.Cog):
ctx, _("You must be in the voice channel to use the playlist command.")
)
return False
- if not await self._currency_check(ctx, jukebox_price):
- return False
+ await self._eq_check(ctx, player)
await self._data_check(ctx)
return True
- async def _playlist_tracks(self, ctx, player, query):
- search = False
+ async def _playlist_tracks(
+ self,
+ ctx: commands.Context,
+ player: lavalink.player_manager.Player,
+ query: dataclasses.Query,
+ ):
+ search = query.is_search
tracklist = []
- if type(query) is tuple:
- query = " ".join(query)
- if "open.spotify.com" in query:
- query = "spotify:{}".format(
- re.sub("(http[s]?:\/\/)?(open.spotify.com)\/", "", query).replace("/", ":")
- )
- if query.startswith("spotify:"):
+
+ if query.is_spotify:
try:
if self.play_lock[ctx.message.guild.id]:
return await self._embed_msg(
@@ -2141,35 +5121,36 @@ class Audio(commands.Cog):
if not tracks:
return await self._embed_msg(ctx, _("Nothing found."))
for track in tracks:
- track_obj = self._track_creator(player, other_track=track)
+ track_obj = track_creator(player, other_track=track)
tracklist.append(track_obj)
self._play_lock(ctx, False)
- elif not query.startswith("http"):
- query = "ytsearch:{}".format(query)
- search = True
- tracks = await player.get_tracks(query)
+ elif query.is_search:
+ result, called_api = await self.music_cache.lavalink_query(ctx, player, query)
+ tracks = result.tracks
if not tracks:
return await self._embed_msg(ctx, _("Nothing found."))
else:
- tracks = await player.get_tracks(query)
+ result, called_api = await self.music_cache.lavalink_query(ctx, player, query)
+ tracks = result.tracks
+
if not search and len(tracklist) == 0:
for track in tracks:
- track_obj = self._track_creator(player, other_track=track)
+ track_obj = track_creator(player, other_track=track)
tracklist.append(track_obj)
elif len(tracklist) == 0:
- track_obj = self._track_creator(player, other_track=tracks[0])
+ track_obj = track_creator(player, other_track=tracks[0])
tracklist.append(track_obj)
return tracklist
@commands.command()
@commands.guild_only()
- async def prev(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def prev(self, ctx: commands.Context):
"""Skip to the start of the previously played track."""
if not self._player_check(ctx):
return await self._embed_msg(ctx, _("Nothing playing."))
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
player = lavalink.get_player(ctx.guild.id)
- shuffle = await self.config.guild(ctx.guild).shuffle()
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author) and not await self._is_alone(
ctx, ctx.author
@@ -2181,22 +5162,25 @@ class Audio(commands.Cog):
return await self._embed_msg(
ctx, _("You must be in the voice channel to skip the music.")
)
- if shuffle:
- return await self._embed_msg(ctx, _("Turn shuffle off to use this command."))
if player.fetch("prev_song") is None:
return await self._embed_msg(ctx, _("No previous track."))
else:
- last_track = await player.get_tracks(player.fetch("prev_song"))
- player.add(player.fetch("prev_requester"), last_track[0])
+ track = player.fetch("prev_song")
+ player.add(player.fetch("prev_requester"), track)
+ self.bot.dispatch("red_audio_track_enqueue", player.channel.guild, track, ctx.author)
queue_len = len(player.queue)
bump_song = player.queue[-1]
player.queue.insert(0, bump_song)
player.queue.pop(queue_len)
await player.skip()
- if "localtracks/" in player.current.uri:
- description = "**{}**\n{}".format(
- player.current.title, player.current.uri.replace("localtracks/", "")
- )
+ query = dataclasses.Query.process_input(player.current.uri)
+ if query.is_local:
+
+ if player.current.title == "Unknown title":
+ description = "{}".format(query.track.to_string_hidden())
+ else:
+ song = bold("{} - {}").format(player.current.author, player.current.title)
+ description = "{}\n{}".format(song, query.track.to_string_hidden())
else:
description = f"**[{player.current.title}]({player.current.uri})**"
embed = discord.Embed(
@@ -2208,41 +5192,116 @@ class Audio(commands.Cog):
@commands.group(invoke_without_command=True)
@commands.guild_only()
- async def queue(self, ctx, *, page="1"):
- """List the queue.
+ @commands.bot_has_permissions(embed_links=True, add_reactions=True)
+ async def queue(self, ctx: commands.Context, *, page: int = 1):
+ """List the songs in the queue."""
+
+ async def _queue_menu(
+ ctx: commands.Context,
+ pages: list,
+ controls: dict,
+ message: discord.Message,
+ page: int,
+ timeout: float,
+ emoji: str,
+ ):
+ if message:
+ await ctx.send_help(self.queue)
+ with contextlib.suppress(discord.HTTPException):
+ await message.delete()
+ return None
+
+ queue_controls = {"⬅": prev_page, "❌": close_menu, "➡": next_page, "ℹ": _queue_menu}
- Use [p]queue search to search the queue.
- """
if not self._player_check(ctx):
return await self._embed_msg(ctx, _("There's nothing in the queue."))
player = lavalink.get_player(ctx.guild.id)
if not player.queue:
- return await self._embed_msg(ctx, _("There's nothing in the queue."))
- if not page.isdigit():
- if page.startswith("search "):
- return await self._queue_search(ctx=ctx, search_words=page.replace("search ", ""))
- else:
- return
- else:
- page = int(page)
- len_queue_pages = math.ceil(len(player.queue) / 10)
- queue_page_list = []
- for page_num in range(1, len_queue_pages + 1):
- embed = await self._build_queue_page(ctx, player, page_num)
- queue_page_list.append(embed)
- if page > len_queue_pages:
- page = len_queue_pages
- await menu(ctx, queue_page_list, DEFAULT_CONTROLS, page=(page - 1))
+ if player.current:
+ arrow = await draw_time(ctx)
+ pos = lavalink.utils.format_time(player.position)
+ if player.current.is_stream:
+ dur = "LIVE"
+ else:
+ dur = lavalink.utils.format_time(player.current.length)
- async def _build_queue_page(self, ctx, player, page_num):
+ query = dataclasses.Query.process_input(player.current)
+
+ if query.is_local:
+ if player.current.title != "Unknown title":
+ song = "**{track.author} - {track.title}**\n{uri}\n"
+ else:
+ song = "{uri}\n"
+ else:
+ song = "**[{track.title}]({track.uri})**\n"
+ song += _("Requested by: **{track.requester}**")
+ song += "\n\n{arrow}`{pos}`/`{dur}`"
+ song = song.format(
+ track=player.current,
+ uri=dataclasses.LocalPath(player.current.uri).to_string_hidden()
+ if dataclasses.Query.process_input(player.current.uri).is_local
+ else player.current.uri,
+ arrow=arrow,
+ pos=pos,
+ dur=dur,
+ )
+
+ embed = discord.Embed(
+ colour=await ctx.embed_colour(), title=_("Now Playing"), description=song
+ )
+ if await self.config.guild(ctx.guild).thumbnail() and player.current:
+ if player.current.thumbnail:
+ embed.set_thumbnail(url=player.current.thumbnail)
+
+ shuffle = await self.config.guild(ctx.guild).shuffle()
+ repeat = await self.config.guild(ctx.guild).repeat()
+ autoplay = await self.config.guild(ctx.guild).auto_play() or self.owns_autoplay
+ text = ""
+ text += (
+ _("Auto-Play")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if autoplay else "\N{CROSS MARK}")
+ )
+ text += (
+ (" | " if text else "")
+ + _("Shuffle")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if shuffle else "\N{CROSS MARK}")
+ )
+ text += (
+ (" | " if text else "")
+ + _("Repeat")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if repeat else "\N{CROSS MARK}")
+ )
+ embed.set_footer(text=text)
+
+ return await ctx.send(embed=embed)
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+
+ async with ctx.typing():
+ len_queue_pages = math.ceil(len(player.queue) / 10)
+ queue_page_list = []
+ for page_num in range(1, len_queue_pages + 1):
+ embed = await self._build_queue_page(ctx, player, page_num)
+ queue_page_list.append(embed)
+ if page > len_queue_pages:
+ page = len_queue_pages
+ return await menu(ctx, queue_page_list, queue_controls, page=(page - 1))
+
+ async def _build_queue_page(
+ self, ctx: commands.Context, player: lavalink.player_manager.Player, page_num
+ ):
shuffle = await self.config.guild(ctx.guild).shuffle()
repeat = await self.config.guild(ctx.guild).repeat()
+ autoplay = await self.config.guild(ctx.guild).auto_play() or self.owns_autoplay
+
queue_num_pages = math.ceil(len(player.queue) / 10)
queue_idx_start = (page_num - 1) * 10
queue_idx_end = queue_idx_start + 10
queue_list = ""
try:
- arrow = await self._draw_time(ctx)
+ arrow = await draw_time(ctx)
except AttributeError:
return await self._embed_msg(ctx, _("There's nothing in the queue."))
pos = lavalink.utils.format_time(player.position)
@@ -2252,16 +5311,21 @@ class Audio(commands.Cog):
else:
dur = lavalink.utils.format_time(player.current.length)
- if player.current.is_stream:
- queue_list += _("**Currently livestreaming:**")
+ query = dataclasses.Query.process_input(player.current)
- elif "localtracks" in player.current.uri:
- if not player.current.title == "Unknown title":
+ if query.is_stream:
+ queue_list += _("**Currently livestreaming:**\n")
+ queue_list += "**[{current.title}]({current.uri})**\n".format(current=player.current)
+ queue_list += _("Requested by: **{user}**").format(user=player.current.requester)
+ queue_list += f"\n\n{arrow}`{pos}`/`{dur}`\n\n"
+
+ elif query.is_local:
+ if player.current.title != "Unknown title":
queue_list += "\n".join(
(
_("Playing: ")
+ "**{current.author} - {current.title}**".format(current=player.current),
- player.current.uri.replace("localtracks/", ""),
+ dataclasses.LocalPath(player.current.uri).to_string_hidden(),
_("Requested by: **{user}**\n").format(user=player.current.requester),
f"{arrow}`{pos}`/`{dur}`\n\n",
)
@@ -2269,7 +5333,8 @@ class Audio(commands.Cog):
else:
queue_list += "\n".join(
(
- _("Playing: ") + player.current.uri.replace("localtracks/", ""),
+ _("Playing: ")
+ + dataclasses.LocalPath(player.current.uri).to_string_hidden(),
_("Requested by: **{user}**\n").format(user=player.current.requester),
f"{arrow}`{pos}`/`{dur}`\n\n",
)
@@ -2290,11 +5355,13 @@ class Audio(commands.Cog):
track_title = track.title
req_user = track.requester
track_idx = i + 1
- if "localtracks" in track.uri:
+ query = dataclasses.Query.process_input(track)
+
+ if query.is_local:
if track.title == "Unknown title":
queue_list += f"`{track_idx}.` " + ", ".join(
(
- bold(track.uri.replace("localtracks/", "")),
+ bold(dataclasses.LocalPath(track.uri).to_string_hidden()),
_("requested by **{user}**\n").format(user=req_user),
)
)
@@ -2313,43 +5380,47 @@ class Audio(commands.Cog):
)
if await self.config.guild(ctx.guild).thumbnail() and player.current.thumbnail:
embed.set_thumbnail(url=player.current.thumbnail)
- queue_duration = await self._queue_duration(ctx)
- queue_total_duration = lavalink.utils.format_time(queue_duration)
+ queue_dur = await queue_duration(ctx)
+ queue_total_duration = lavalink.utils.format_time(queue_dur)
text = _(
- "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
+ "Page {page_num}/{total_pages} | {num_tracks} "
+ "tracks, {num_remaining} remaining | \n\n"
).format(
page_num=page_num,
total_pages=queue_num_pages,
num_tracks=len(player.queue) + 1,
num_remaining=queue_total_duration,
)
- if repeat:
- text += " | " + _("Repeat") + ": \N{WHITE HEAVY CHECK MARK}"
- if shuffle:
- text += " | " + _("Shuffle") + ": \N{WHITE HEAVY CHECK MARK}"
+ text += (
+ _("Auto-Play")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if autoplay else "\N{CROSS MARK}")
+ )
+ text += (
+ (" | " if text else "")
+ + _("Shuffle")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if shuffle else "\N{CROSS MARK}")
+ )
+ text += (
+ (" | " if text else "")
+ + _("Repeat")
+ + ": "
+ + ("\N{WHITE HEAVY CHECK MARK}" if repeat else "\N{CROSS MARK}")
+ )
embed.set_footer(text=text)
return embed
- async def _queue_search(self, ctx, *, search_words):
- player = lavalink.get_player(ctx.guild.id)
- search_list = await self._build_queue_search_list(player.queue, search_words)
- if not search_list:
- return await self._embed_msg(ctx, _("No matches."))
- len_search_pages = math.ceil(len(search_list) / 10)
- search_page_list = []
- for page_num in range(1, len_search_pages + 1):
- embed = await self._build_queue_search_page(ctx, page_num, search_list)
- search_page_list.append(embed)
- await menu(ctx, search_page_list, DEFAULT_CONTROLS)
-
- async def _build_queue_search_list(self, queue_list, search_words):
+ @staticmethod
+ async def _build_queue_search_list(queue_list, search_words):
track_list = []
queue_idx = 0
for track in queue_list:
queue_idx = queue_idx + 1
- if not self._match_url(track.uri):
+ if not match_url(track.uri):
+ query = dataclasses.Query.process_input(track)
if track.title == "Unknown title":
- track_title = track.uri.split("/")[2]
+ track_title = query.track.to_string_hidden()
else:
track_title = "{} - {}".format(track.author, track.title)
else:
@@ -2365,19 +5436,18 @@ class Audio(commands.Cog):
search_list.append([queue_position, title])
return search_list
- async def _build_queue_search_page(self, ctx, page_num, search_list):
+ @staticmethod
+ async def _build_queue_search_page(ctx: commands.Context, page_num, search_list):
search_num_pages = math.ceil(len(search_list) / 10)
search_idx_start = (page_num - 1) * 10
search_idx_end = search_idx_start + 10
track_match = ""
- command = ctx.invoked_with
for i, track in enumerate(
search_list[search_idx_start:search_idx_end], start=search_idx_start
):
track_idx = i + 1
- if command == "search":
- local_path = await self.config.localpath()
- track_location = track.replace("localtrack:{}/localtracks/".format(local_path), "")
+ if type(track) is str:
+ track_location = dataclasses.LocalPath(track).to_string_hidden()
track_match += "`{}.` **{}**\n".format(track_idx, track_location)
else:
track_match += "`{}.` **{}**\n".format(track[0], track[1])
@@ -2393,7 +5463,7 @@ class Audio(commands.Cog):
@queue.command(name="clear")
@commands.guild_only()
- async def _queue_clear(self, ctx):
+ async def _queue_clear(self, ctx: commands.Context):
"""Clears the queue."""
try:
player = lavalink.get_player(ctx.guild.id)
@@ -2412,7 +5482,7 @@ class Audio(commands.Cog):
@queue.command(name="clean")
@commands.guild_only()
- async def _queue_clean(self, ctx):
+ async def _queue_clean(self, ctx: commands.Context):
"""Removes songs from the queue if the requester is not in the voice channel."""
try:
player = lavalink.get_player(ctx.guild.id)
@@ -2441,13 +5511,106 @@ class Audio(commands.Cog):
await self._embed_msg(
ctx,
_(
- "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+ "Removed {removed_tracks} tracks queued by members o"
+ "utside of the voice channel."
).format(removed_tracks=removed_tracks),
)
+ @queue.command(name="cleanself")
+ @commands.guild_only()
+ async def _queue_cleanself(self, ctx: commands.Context):
+ """Removes all tracks you requested from the queue."""
+
+ try:
+ player = lavalink.get_player(ctx.guild.id)
+ except KeyError:
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+ if not self._player_check(ctx) or not player.queue:
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+
+ clean_tracks = []
+ removed_tracks = 0
+ for track in player.queue:
+ if track.requester != ctx.author:
+ clean_tracks.append(track)
+ else:
+ removed_tracks += 1
+ player.queue = clean_tracks
+ if removed_tracks == 0:
+ await self._embed_msg(ctx, _("Removed 0 tracks."))
+ else:
+ await self._embed_msg(
+ ctx,
+ _("Removed {removed_tracks} tracks queued by {member.display_name}.").format(
+ removed_tracks=removed_tracks, member=ctx.author
+ ),
+ )
+
+ @queue.command(name="search")
+ @commands.guild_only()
+ async def _queue_search(self, ctx: commands.Context, *, search_words: str):
+ """Search the queue."""
+ try:
+ player = lavalink.get_player(ctx.guild.id)
+ except KeyError:
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+ if not self._player_check(ctx) or not player.queue:
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+
+ search_list = await self._build_queue_search_list(player.queue, search_words)
+ if not search_list:
+ return await self._embed_msg(ctx, _("No matches."))
+
+ len_search_pages = math.ceil(len(search_list) / 10)
+ search_page_list = []
+ for page_num in range(1, len_search_pages + 1):
+ embed = await self._build_queue_search_page(ctx, page_num, search_list)
+ search_page_list.append(embed)
+ await menu(ctx, search_page_list, DEFAULT_CONTROLS)
+
+ @queue.command(name="shuffle")
+ @commands.guild_only()
+ async def _queue_shuffle(self, ctx: commands.Context):
+ """Shuffles the queue."""
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author) and not await self._is_alone(
+ ctx, ctx.author
+ ):
+ return await self._embed_msg(ctx, _("You need the DJ role to clean the queue."))
+ if not self._player_check(ctx):
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+ try:
+ if (
+ not ctx.author.voice.channel.permissions_for(ctx.me).connect
+ or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
+ and userlimit(ctx.author.voice.channel)
+ ):
+ return await self._embed_msg(
+ ctx, _("I don't have permission to connect to your channel.")
+ )
+ await lavalink.connect(ctx.author.voice.channel)
+ player = lavalink.get_player(ctx.guild.id)
+ player.store("connect", datetime.datetime.utcnow())
+ except AttributeError:
+ return await self._embed_msg(ctx, _("Connect to a voice channel first."))
+ except IndexError:
+ return await self._embed_msg(
+ ctx, _("Connection to Lavalink has not yet been established.")
+ )
+ except KeyError:
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+
+ if not self._player_check(ctx) or not player.queue:
+ return await self._embed_msg(ctx, _("There's nothing in the queue."))
+
+ player.force_shuffle(0)
+ return await self._embed_msg(ctx, _("Queue has been shuffled."))
+
@commands.command()
@commands.guild_only()
- async def repeat(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def repeat(self, ctx: commands.Context):
"""Toggle repeat."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if dj_enabled:
@@ -2455,9 +5618,6 @@ class Audio(commands.Cog):
ctx, ctx.author
):
return await self._embed_msg(ctx, _("You need the DJ role to toggle repeat."))
- repeat = await self.config.guild(ctx.guild).repeat()
- await self.config.guild(ctx.guild).repeat.set(not repeat)
- repeat = await self.config.guild(ctx.guild).repeat()
if self._player_check(ctx):
await self._data_check(ctx)
player = lavalink.get_player(ctx.guild.id)
@@ -2467,13 +5627,29 @@ class Audio(commands.Cog):
return await self._embed_msg(
ctx, _("You must be in the voice channel to toggle repeat.")
)
- await self._embed_msg(
- ctx, _("Repeat tracks: {true_or_false}.").format(true_or_false=repeat)
+
+ autoplay = await self.config.guild(ctx.guild).auto_play()
+ repeat = await self.config.guild(ctx.guild).repeat()
+ msg = ""
+ msg += _("Repeat tracks: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not repeat else _("Disabled")
)
+ await self.config.guild(ctx.guild).repeat.set(not repeat)
+ if repeat is not True and autoplay is True:
+ msg += _("\nAuto-play has been disabled.")
+ await self.config.guild(ctx.guild).auto_play.set(False)
+
+ embed = discord.Embed(
+ title=_("Repeat settings changed"), description=msg, colour=await ctx.embed_colour()
+ )
+ await ctx.send(embed=embed)
+ if self._player_check(ctx):
+ await self._data_check(ctx)
@commands.command()
@commands.guild_only()
- async def remove(self, ctx, index: int):
+ @commands.bot_has_permissions(embed_links=True)
+ async def remove(self, ctx: commands.Context, index: int):
"""Remove a specific track number from the queue."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx):
@@ -2496,11 +5672,13 @@ class Audio(commands.Cog):
)
index -= 1
removed = player.queue.pop(index)
- if "localtracks/" in removed.uri:
+ query = dataclasses.Query.process_input(removed.uri)
+ if query.is_local:
+ local_path = dataclasses.LocalPath(removed.uri).to_string_hidden()
if removed.title == "Unknown title":
- removed_title = removed.uri.replace("localtracks/", "")
+ removed_title = local_path
else:
- removed_title = "{} - {}".format(removed.author, removed.title)
+ removed_title = "{} - {}\n{}".format(removed.author, removed.title, local_path)
else:
removed_title = removed.title
await self._embed_msg(
@@ -2509,7 +5687,8 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def search(self, ctx, *, query):
+ @commands.bot_has_permissions(embed_links=True, add_reactions=True)
+ async def search(self, ctx: commands.Context, *, query: str):
"""Pick a track with a search.
Use `[p]search list ` to queue all tracks found
@@ -2528,10 +5707,11 @@ class Audio(commands.Cog):
):
if message:
await self._search_button_action(ctx, tracks, emoji, page)
- await message.delete()
+ with contextlib.suppress(discord.HTTPException):
+ await message.delete()
return None
- SEARCH_CONTROLS = {
+ search_controls = {
"1⃣": _search_menu,
"2⃣": _search_menu,
"3⃣": _search_menu,
@@ -2543,11 +5723,16 @@ class Audio(commands.Cog):
}
if not self._player_check(ctx):
+ if self._connection_aborted:
+ msg = _("Connection to Lavalink has failed.")
+ if await ctx.bot.is_owner(ctx.author):
+ msg += " " + _("Please check your console or logs for details.")
+ return await self._embed_msg(ctx, msg)
try:
if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
- and self._userlimit(ctx.author.voice.channel)
+ and userlimit(ctx.author.voice.channel)
):
return await self._embed_msg(
ctx, _("I don't have permission to connect to your channel.")
@@ -2571,34 +5756,60 @@ class Audio(commands.Cog):
return await self._embed_msg(
ctx, _("You must be in the voice channel to enqueue tracks.")
)
+ await self._eq_check(ctx, player)
await self._data_check(ctx)
if not isinstance(query, list):
- query = query.strip("<>")
- if query.startswith("list ") or query.startswith("folder:"):
- if query.startswith("list "):
- query = "ytsearch:{}".format(query.replace("list ", ""))
- tracks = await player.get_tracks(query)
+ query = dataclasses.Query.process_input(query)
+ if query.invoked_from == "search list" or query.invoked_from == "local folder":
+ if query.invoked_from == "search list":
+ result, called_api = await self.music_cache.lavalink_query(ctx, player, query)
+ tracks = result.tracks
else:
- query = query.replace("folder:", "")
tracks = await self._folder_tracks(ctx, player, query)
if not tracks:
- return await self._embed_msg(ctx, _("Nothing found."))
-
- queue_duration = await self._queue_duration(ctx)
- queue_total_duration = lavalink.utils.format_time(queue_duration)
+ embed = discord.Embed(
+ title=_("Nothing found."), colour=await ctx.embed_colour()
+ )
+ if await self.config.use_external_lavalink() and query.is_local:
+ embed.description = _(
+ "Local tracks will not work "
+ "if the `Lavalink.jar` cannot see the track.\n"
+ "This may be due to permissions or because Lavalink.jar is being run "
+ "in a different machine than the local tracks."
+ )
+ return await ctx.send(embed=embed)
+ queue_dur = await queue_duration(ctx)
+ queue_total_duration = lavalink.utils.format_time(queue_dur)
track_len = 0
+ empty_queue = not player.queue
for track in tracks:
- if guild_data["maxlength"] > 0:
- if self._track_limit(ctx, track, guild_data["maxlength"]):
+ if not await is_allowed(
+ ctx.guild,
+ (
+ f"{track.title} {track.author} {track.uri} "
+ f"{str(dataclasses.Query.process_input(track))}"
+ ),
+ ):
+ log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
+ continue
+ elif guild_data["maxlength"] > 0:
+ if track_limit(track, guild_data["maxlength"]):
track_len += 1
player.add(ctx.author, track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, track, ctx.author
+ )
else:
track_len += 1
player.add(ctx.author, track)
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, track, ctx.author
+ )
if not player.current:
await player.play()
+ player.maybe_shuffle(0 if empty_queue else 1)
if len(tracks) > track_len:
maxlength_msg = " {bad_tracks} tracks cannot be queued.".format(
bad_tracks=(len(tracks) - track_len)
@@ -2611,33 +5822,33 @@ class Audio(commands.Cog):
num=track_len, maxlength_msg=maxlength_msg
),
)
- if not guild_data["shuffle"] and queue_duration > 0:
+ if not guild_data["shuffle"] and queue_dur > 0:
songembed.set_footer(
text=_(
"{time} until start of search playback: starts at #{position} in queue"
).format(time=queue_total_duration, position=len(player.queue) + 1)
)
return await ctx.send(embed=songembed)
- elif query.startswith("sc "):
- query = "scsearch:{}".format(query.replace("sc ", ""))
- tracks = await player.get_tracks(query)
- elif ":localtrack:" in query:
- track_location = query.split(":")[2]
- tracks = await self._folder_list(ctx, track_location)
- elif query.startswith("localfolder:") and ":localtrack:" not in query:
- folder = query.split(":")[1]
+ elif query.is_local and query.single_track:
+ tracks = await self._folder_list(ctx, query)
+ elif query.is_local and query.is_album:
if ctx.invoked_with == "folder":
- localfolder = query.replace("localfolder:", "")
- return await self._local_play_all(ctx, localfolder)
+ return await self._local_play_all(ctx, query, from_search=True)
else:
- tracks = await self._folder_list(ctx, folder)
- elif not self._match_url(query):
- query = "ytsearch:{}".format(query)
- tracks = await player.get_tracks(query)
+ tracks = await self._folder_list(ctx, query)
else:
- tracks = await player.get_tracks(query)
+ result, called_api = await self.music_cache.lavalink_query(ctx, player, query)
+ tracks = result.tracks
if not tracks:
- return await self._embed_msg(ctx, _("Nothing found."))
+ embed = discord.Embed(title=_("Nothing found."), colour=await ctx.embed_colour())
+ if await self.config.use_external_lavalink() and query.is_local:
+ embed.description = _(
+ "Local tracks will not work "
+ "if the `Lavalink.jar` cannot see the track.\n"
+ "This may be due to permissions or because Lavalink.jar is being run "
+ "in a different machine than the local tracks."
+ )
+ return await ctx.send(embed=embed)
else:
tracks = query
@@ -2652,10 +5863,15 @@ class Audio(commands.Cog):
if not await self._can_instaskip(ctx, ctx.author):
return await menu(ctx, search_page_list, DEFAULT_CONTROLS)
- await menu(ctx, search_page_list, SEARCH_CONTROLS)
+ await menu(ctx, search_page_list, search_controls)
- async def _search_button_action(self, ctx, tracks, emoji, page):
+ async def _search_button_action(self, ctx: commands.Context, tracks, emoji, page):
if not self._player_check(ctx):
+ if self._connection_aborted:
+ msg = _("Connection to Lavalink has failed.")
+ if await ctx.bot.is_owner(ctx.author):
+ msg += " " + _("Please check your console or logs for details.")
+ return await self._embed_msg(ctx, msg)
try:
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
@@ -2668,78 +5884,97 @@ class Audio(commands.Cog):
)
player = lavalink.get_player(ctx.guild.id)
guild_data = await self.config.guild(ctx.guild).all()
- command = ctx.invoked_with
if not await self._currency_check(ctx, guild_data["jukebox_price"]):
return
try:
if emoji == "1⃣":
search_choice = tracks[0 + (page * 5)]
- if emoji == "2⃣":
+ elif emoji == "2⃣":
search_choice = tracks[1 + (page * 5)]
- if emoji == "3⃣":
+ elif emoji == "3⃣":
search_choice = tracks[2 + (page * 5)]
- if emoji == "4⃣":
+ elif emoji == "4⃣":
search_choice = tracks[3 + (page * 5)]
- if emoji == "5⃣":
+ elif emoji == "5⃣":
search_choice = tracks[4 + (page * 5)]
+ else:
+ search_choice = tracks[0 + (page * 5)]
+ # TODO: verify this does not break exit and arrows
except IndexError:
search_choice = tracks[-1]
try:
- if "localtracks" in search_choice.uri:
- if search_choice.title == "Unknown title":
+ query = dataclasses.Query.process_input(search_choice.uri)
+ if query.is_local:
+
+ localtrack = dataclasses.LocalPath(search_choice.uri)
+ if search_choice.title != "Unknown title":
description = "**{} - {}**\n{}".format(
- search_choice.author,
- search_choice.title,
- search_choice.uri.replace("localtracks/", ""),
+ search_choice.author, search_choice.title, localtrack.to_string_hidden()
)
else:
- description = "{}".format(search_choice.uri.replace("localtracks/", ""))
+ description = localtrack.to_string_hidden()
else:
description = "**[{}]({})**".format(search_choice.title, search_choice.uri)
except AttributeError:
- if command == "search":
- return await ctx.invoke(self.play, query=("localtracks/{}".format(search_choice)))
- search_choice = search_choice.replace("localtrack:", "")
- local_path = await self.config.localpath()
- if not search_choice.startswith(local_path):
- return await ctx.invoke(
- self.search, query=("localfolder:{}".format(search_choice))
- )
- else:
- return await ctx.invoke(self.play, query=("localtrack:{}".format(search_choice)))
+ search_choice = dataclasses.Query.process_input(search_choice)
+ if search_choice.track.exists() and search_choice.track.is_dir():
+ return await ctx.invoke(self.search, query=search_choice)
+ elif search_choice.track.exists() and search_choice.track.is_file():
+ search_choice.invoked_from = "localtrack"
+ return await ctx.invoke(self.play, query=search_choice)
embed = discord.Embed(
colour=await ctx.embed_colour(), title=_("Track Enqueued"), description=description
)
- queue_duration = await self._queue_duration(ctx)
- queue_total_duration = lavalink.utils.format_time(queue_duration)
- if not guild_data["shuffle"] and queue_duration > 0:
+ queue_dur = await queue_duration(ctx)
+ queue_total_duration = lavalink.utils.format_time(queue_dur)
+ if not await is_allowed(
+ ctx.guild,
+ (
+ f"{search_choice.title} {search_choice.author} {search_choice.uri} "
+ f"{str(dataclasses.Query.process_input(search_choice))}"
+ ),
+ ):
+ log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
+ self._play_lock(ctx, False)
+ return await self._embed_msg(ctx, _("This track is not allowed in this server."))
+ elif guild_data["maxlength"] > 0:
+
+ if track_limit(search_choice.length, guild_data["maxlength"]):
+ player.add(ctx.author, search_choice)
+ player.maybe_shuffle()
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, search_choice, ctx.author
+ )
+ else:
+ return await self._embed_msg(ctx, _("Track exceeds maximum length."))
+ else:
+ player.add(ctx.author, search_choice)
+ player.maybe_shuffle()
+ self.bot.dispatch(
+ "red_audio_track_enqueue", player.channel.guild, search_choice, ctx.author
+ )
+
+ if not guild_data["shuffle"] and queue_dur > 0:
embed.set_footer(
text=_("{time} until track playback: #{position} in queue").format(
time=queue_total_duration, position=len(player.queue) + 1
)
)
- elif queue_duration > 0:
- embed.set_footer(text=_("#{position} in queue").format(position=len(player.queue) + 1))
- if guild_data["maxlength"] > 0:
- if self._track_limit(ctx, search_choice.length, guild_data["maxlength"]):
- player.add(ctx.author, search_choice)
- else:
- return await self._embed_msg(ctx, _("Track exceeds maximum length."))
- else:
- player.add(ctx.author, search_choice)
if not player.current:
await player.play()
await ctx.send(embed=embed)
- async def _build_search_page(self, ctx, tracks, page_num):
+ @staticmethod
+ async def _build_search_page(ctx: commands.Context, tracks, page_num):
search_num_pages = math.ceil(len(tracks) / 5)
search_idx_start = (page_num - 1) * 5
search_idx_end = search_idx_start + 5
search_list = ""
command = ctx.invoked_with
+ folder = False
for i, track in enumerate(tracks[search_idx_start:search_idx_end], start=search_idx_start):
search_track_num = i + 1
if search_track_num > 5:
@@ -2747,39 +5982,42 @@ class Audio(commands.Cog):
if search_track_num == 0:
search_track_num = 5
try:
- if "localtracks" in track.uri:
+ query = dataclasses.Query.process_input(track.uri)
+ if query.is_local:
search_list += "`{0}.` **{1}**\n[{2}]\n".format(
- search_track_num, track.title, track.uri.replace("localtracks/", "")
+ search_track_num,
+ track.title,
+ dataclasses.LocalPath(track.uri).to_string_hidden(),
)
else:
search_list += "`{0}.` **[{1}]({2})**\n".format(
search_track_num, track.title, track.uri
)
except AttributeError:
- if "localtrack:" not in track and command != "search":
- search_list += "`{}.` **{}**\n".format(search_track_num, track)
+ # query = Query.process_input(track)
+ track = dataclasses.Query.process_input(track)
+ if track.is_local and command != "search":
+ search_list += "`{}.` **{}**\n".format(
+ search_track_num, track.to_string_user()
+ )
folder = True
elif command == "search":
- search_list += "`{}.` **{}**\n".format(search_track_num, track)
- folder = False
- else:
- local_path = await self.config.localpath()
search_list += "`{}.` **{}**\n".format(
- search_track_num,
- track.replace("localtrack:{}/localtracks/".format(local_path), ""),
+ search_track_num, track.to_string_user()
)
- folder = False
- try:
- title_check = tracks[0].uri
+ else:
+ search_list += "`{}.` **{}**\n".format(
+ search_track_num, track.to_string_user()
+ )
+ if hasattr(tracks[0], "uri"):
title = _("Tracks Found:")
footer = _("search results")
- except AttributeError:
- if folder:
- title = _("Folders Found:")
- footer = _("local folders")
- else:
- title = _("Files Found:")
- footer = _("local tracks")
+ elif folder:
+ title = _("Folders Found:")
+ footer = _("local folders")
+ else:
+ title = _("Files Found:")
+ footer = _("local tracks")
embed = discord.Embed(
colour=await ctx.embed_colour(), title=title, description=search_list
)
@@ -2795,31 +6033,33 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def seek(self, ctx, seconds):
+ @commands.bot_has_permissions(embed_links=True)
+ async def seek(self, ctx: commands.Context, seconds: Union[int, str]):
"""Seek ahead or behind on a track by seconds or a to a specific time.
Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
vote_enabled = await self.config.guild(ctx.guild).vote_enabled()
+ is_alone = await self._is_alone(ctx, ctx.author)
+ is_requester = await self.is_requester(ctx, ctx.author)
+ can_skip = await self._can_instaskip(ctx, ctx.author)
+
if not self._player_check(ctx):
return await self._embed_msg(ctx, _("Nothing playing."))
player = lavalink.get_player(ctx.guild.id)
- if (
- not ctx.author.voice or ctx.author.voice.channel != player.channel
- ) and not await self._can_instaskip(ctx, ctx.author):
+ if (not ctx.author.voice or ctx.author.voice.channel != player.channel) and not can_skip:
return await self._embed_msg(ctx, _("You must be in the voice channel to use seek."))
- if dj_enabled:
- if not await self._can_instaskip(ctx, ctx.author) and not await self._is_alone(
- ctx, ctx.author
- ):
- return await self._embed_msg(ctx, _("You need the DJ role to use seek."))
- if vote_enabled:
- if not await self._can_instaskip(ctx, ctx.author) and not await self._is_alone(
- ctx, ctx.author
- ):
- return await self._embed_msg(
- ctx, _("There are other people listening - vote to skip instead.")
- )
+
+ if vote_enabled and not can_skip and not is_alone:
+ return await self._embed_msg(
+ ctx, _("There are other people listening - vote to skip instead.")
+ )
+
+ if dj_enabled and not (can_skip or is_requester) and not is_alone:
+ return await self._embed_msg(
+ ctx, _("You need the DJ role or be the track requester to use seek.")
+ )
+
if player.current:
if player.current.is_stream:
return await self._embed_msg(ctx, _("Can't seek on a stream."))
@@ -2829,7 +6069,7 @@ class Audio(commands.Cog):
abs_position = False
except ValueError:
abs_position = True
- seconds = int(await self._time_convert(seconds) / 1000)
+ seconds = time_convert(seconds)
if seconds == 0:
return await self._embed_msg(ctx, _("Invalid input for the time to seek."))
if not abs_position:
@@ -2860,15 +6100,13 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def shuffle(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def shuffle(self, ctx: commands.Context):
"""Toggle shuffle."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, _("You need the DJ role to toggle shuffle."))
- shuffle = await self.config.guild(ctx.guild).shuffle()
- await self.config.guild(ctx.guild).shuffle.set(not shuffle)
- shuffle = await self.config.guild(ctx.guild).shuffle()
if self._player_check(ctx):
await self._data_check(ctx)
player = lavalink.get_player(ctx.guild.id)
@@ -2878,14 +6116,23 @@ class Audio(commands.Cog):
return await self._embed_msg(
ctx, _("You must be in the voice channel to toggle shuffle.")
)
+
+ shuffle = await self.config.guild(ctx.guild).shuffle()
+ await self.config.guild(ctx.guild).shuffle.set(not shuffle)
await self._embed_msg(
- ctx, _("Shuffle tracks: {true_or_false}.").format(true_or_false=shuffle)
+ ctx,
+ _("Shuffle tracks: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not shuffle else _("Disabled")
+ ),
)
+ if self._player_check(ctx):
+ await self._data_check(ctx)
@commands.command()
@commands.guild_only()
- async def sing(self, ctx):
- """Make Red sing one of her songs"""
+ @commands.bot_has_permissions(embed_links=True)
+ async def sing(self, ctx: commands.Context):
+ """Make Red sing one of her songs."""
ids = (
"zGTkAVsrfg8",
"cGMWL8cOeAU",
@@ -2899,7 +6146,8 @@ class Audio(commands.Cog):
@commands.command()
@commands.guild_only()
- async def skip(self, ctx, skip_to_track: int = None):
+ @commands.bot_has_permissions(embed_links=True)
+ async def skip(self, ctx: commands.Context, skip_to_track: int = None):
"""Skip to the next track, or to a given track number."""
if not self._player_check(ctx):
return await self._embed_msg(ctx, _("Nothing playing."))
@@ -2910,13 +6158,29 @@ class Audio(commands.Cog):
return await self._embed_msg(
ctx, _("You must be in the voice channel to skip the music.")
)
+ if not player.current:
+ return await self._embed_msg(ctx, _("Nothing playing."))
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
vote_enabled = await self.config.guild(ctx.guild).vote_enabled()
- if dj_enabled and not vote_enabled and not await self._can_instaskip(ctx, ctx.author):
- if not await self._is_alone(ctx, ctx.author):
- return await self._embed_msg(ctx, _("You need the DJ role to skip tracks."))
+ is_alone = await self._is_alone(ctx, ctx.author)
+ is_requester = await self.is_requester(ctx, ctx.author)
+ can_skip = await self._can_instaskip(ctx, ctx.author)
+
+ if dj_enabled and not vote_enabled:
+ if not (can_skip or is_requester) and not is_alone:
+ return await self._embed_msg(
+ ctx, _("You need the DJ role or be the track requester to skip tracks.")
+ )
+ if (
+ is_requester
+ and not can_skip
+ and isinstance(skip_to_track, int)
+ and skip_to_track > 1
+ ):
+ return await self._embed_msg(ctx, _("You can only skip the current track."))
+
if vote_enabled:
- if not await self._can_instaskip(ctx, ctx.author):
+ if not can_skip:
if skip_to_track is not None:
return await self._embed_msg(
ctx, _("Can't skip to a specific track in vote mode without the DJ role.")
@@ -2946,8 +6210,8 @@ class Audio(commands.Cog):
" Votes: {num_votes}/{num_members}"
" ({cur_percent}% out of {required_percent}% needed)"
).format(
- num_votes=num_votes,
- num_members=num_members,
+ num_votes=humanize_number(num_votes),
+ num_members=humanize_number(num_members),
cur_percent=vote,
required_percent=percent,
)
@@ -2957,37 +6221,32 @@ class Audio(commands.Cog):
else:
return await self._skip_action(ctx, skip_to_track)
- async def _can_instaskip(self, ctx, member):
- mod_role = await ctx.bot.db.guild(ctx.guild).mod_role()
- admin_role = await ctx.bot.db.guild(ctx.guild).admin_role()
+ async def _can_instaskip(self, ctx: commands.Context, member: discord.Member):
+
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if member.bot:
+ return True
+
+ if member.id == ctx.guild.owner_id:
+ return True
+
if dj_enabled:
- is_active_dj = await self._has_dj_role(ctx, member)
- else:
- is_active_dj = False
- is_owner = member.id == self.bot.owner_id
- is_server_owner = member.id == ctx.guild.owner_id
- is_coowner = any(x == member.id for x in self.bot._co_owners)
- is_admin = (
- discord.utils.get(ctx.guild.get_member(member.id).roles, id=admin_role) is not None
- )
- is_mod = discord.utils.get(ctx.guild.get_member(member.id).roles, id=mod_role) is not None
- is_bot = member.bot is True
- is_other_channel = await self._channel_check(ctx)
+ if await self._has_dj_role(ctx, member):
+ return True
- return (
- is_active_dj
- or is_owner
- or is_server_owner
- or is_coowner
- or is_admin
- or is_mod
- or is_bot
- or is_other_channel
- )
+ if await ctx.bot.is_owner(member):
+ return True
- async def _is_alone(self, ctx, member):
+ if await ctx.bot.is_mod(member):
+ return True
+
+ if await self._channel_check(ctx):
+ return True
+
+ return False
+
+ async def _is_alone(self, ctx: commands.Context, member: discord.Member):
try:
user_voice = ctx.guild.get_member(member.id).voice
bot_voice = ctx.guild.get_member(self.bot.user.id).voice
@@ -3007,16 +6266,28 @@ class Audio(commands.Cog):
nonbots = 0
return nonbots <= 1
- async def _has_dj_role(self, ctx, member):
+ async def _has_dj_role(self, ctx: commands.Context, member: discord.Member):
dj_role_obj = ctx.guild.get_role(await self.config.guild(ctx.guild).dj_role())
if dj_role_obj in ctx.guild.get_member(member.id).roles:
return True
- else:
- return False
+ return False
- async def _skip_action(self, ctx, skip_to_track: int = None):
+ @staticmethod
+ async def is_requester(ctx: commands.Context, member: discord.Member):
+ try:
+ player = lavalink.get_player(ctx.guild.id)
+ log.debug(f"Current requester is {player.current}")
+ if player.current.requester.id == member.id:
+ return True
+ return False
+ except Exception as e:
+ log.error(e)
+ return False
+
+ async def _skip_action(self, ctx: commands.Context, skip_to_track: int = None):
player = lavalink.get_player(ctx.guild.id)
- if not player.queue:
+ autoplay = await self.config.guild(player.channel.guild).auto_play() or self.owns_autoplay
+ if not player.current or (not player.queue and not autoplay):
try:
pos, dur = player.position, player.current.length
except AttributeError:
@@ -3039,6 +6310,15 @@ class Audio(commands.Cog):
)
)
return await ctx.send(embed=embed)
+ elif autoplay and not player.queue:
+ embed = discord.Embed(
+ colour=await ctx.embed_colour(),
+ title=_("Track Skipped"),
+ description=await get_description(player.current),
+ )
+ await ctx.send(embed=embed)
+ return await player.skip()
+
queue_to_append = []
if skip_to_track is not None and skip_to_track != 1:
if skip_to_track < 1:
@@ -3054,11 +6334,6 @@ class Audio(commands.Cog):
)
),
)
- elif player.shuffle:
- return await self._embed_msg(
- ctx, _("Can't skip to a track while shuffle is enabled.")
- )
- nexttrack = player.queue[min(skip_to_track - 1, len(player.queue) - 1)]
embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("{skip_to_track} Tracks Skipped".format(skip_to_track=skip_to_track)),
@@ -3073,27 +6348,17 @@ class Audio(commands.Cog):
embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("Track Skipped"),
- description=await self._get_description(player.current),
+ description=await get_description(player.current),
)
await ctx.send(embed=embed)
-
+ self.bot.dispatch("red_audio_skip_track", player.channel.guild, player.current, ctx.author)
await player.play()
player.queue += queue_to_append
- async def _get_description(self, track):
- if "localtracks" in track.uri:
- if not track.title == "Unknown title":
- return "**{} - {}**\n{}".format(
- track.author, track.title, track.uri.replace("localtracks/", "")
- )
- else:
- return "{}".format(track.uri.replace("localtracks/", ""))
- else:
- return "**[{}]({})**".format(track.title, track.uri)
-
@commands.command()
@commands.guild_only()
- async def stop(self, ctx):
+ @commands.bot_has_permissions(embed_links=True)
+ async def stop(self, ctx: commands.Context):
"""Stop playback and clear the queue."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
vote_enabled = await self.config.guild(ctx.guild).vote_enabled()
@@ -3116,17 +6381,62 @@ class Audio(commands.Cog):
if dj_enabled and not vote_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, _("You need the DJ role to stop the music."))
- if (player.is_playing) or (not player.is_playing and player.paused):
- await self._embed_msg(ctx, _("Stopping..."))
- await player.stop()
+ if (
+ player.is_playing
+ or (not player.is_playing and player.paused)
+ or player.queue
+ or getattr(player.current, "extras", {}).get("autoplay")
+ ):
+ eq = player.fetch("eq")
+ if eq:
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
+ player.queue = []
+ player.store("playing_song", None)
player.store("prev_requester", None)
player.store("prev_song", None)
- player.store("playing_song", None)
player.store("requester", None)
+ await player.stop()
+ await self._embed_msg(ctx, _("Stopping..."))
@commands.command()
@commands.guild_only()
- async def volume(self, ctx, vol: int = None):
+ @commands.cooldown(1, 15, commands.BucketType.guild)
+ @commands.bot_has_permissions(embed_links=True)
+ async def summon(self, ctx: commands.Context):
+ """Summon the bot to a voice channel."""
+ dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
+ if dj_enabled:
+ if not await self._can_instaskip(ctx, ctx.author):
+ return await self._embed_msg(ctx, _("You need the DJ role to summon the bot."))
+ try:
+ if (
+ not ctx.author.voice.channel.permissions_for(ctx.me).connect
+ or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
+ and userlimit(ctx.author.voice.channel)
+ ):
+ return await self._embed_msg(
+ ctx, _("I don't have permission to connect to your channel.")
+ )
+ if not self._player_check(ctx):
+ await lavalink.connect(ctx.author.voice.channel)
+ player = lavalink.get_player(ctx.guild.id)
+ player.store("connect", datetime.datetime.utcnow())
+ else:
+ player = lavalink.get_player(ctx.guild.id)
+ if ctx.author.voice.channel == player.channel:
+ return
+ await player.move_to(ctx.author.voice.channel)
+ except AttributeError:
+ return await self._embed_msg(ctx, _("Connect to a voice channel first."))
+ except IndexError:
+ return await self._embed_msg(
+ ctx, _("Connection to Lavalink has not yet been established.")
+ )
+
+ @commands.command()
+ @commands.guild_only()
+ @commands.bot_has_permissions(embed_links=True)
+ async def volume(self, ctx: commands.Context, vol: int = None):
"""Set the volume, 1% - 150%."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not vol:
@@ -3172,13 +6482,14 @@ class Audio(commands.Cog):
@commands.group(aliases=["llset"])
@commands.guild_only()
+ @commands.bot_has_permissions(embed_links=True)
@checks.is_owner()
- async def llsetup(self, ctx):
+ async def llsetup(self, ctx: commands.Context):
"""Lavalink server configuration options."""
pass
@llsetup.command()
- async def external(self, ctx):
+ async def external(self, ctx: commands.Context):
"""Toggle using external lavalink servers."""
external = await self.config.use_external_lavalink()
await self.config.use_external_lavalink.set(not external)
@@ -3187,7 +6498,7 @@ class Audio(commands.Cog):
embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("External lavalink server: {true_or_false}.").format(
- true_or_false=not external
+ true_or_false=_("Enabled") if not external else _("Disabled")
),
)
await ctx.send(embed=embed)
@@ -3196,13 +6507,15 @@ class Audio(commands.Cog):
await self._manager.shutdown()
await self._embed_msg(
ctx,
- _("External lavalink server: {true_or_false}.").format(true_or_false=not external),
+ _("External lavalink server: {true_or_false}.").format(
+ true_or_false=_("Enabled") if not external else _("Disabled")
+ ),
)
self._restart_connect()
@llsetup.command()
- async def host(self, ctx, host):
+ async def host(self, ctx: commands.Context, host: str):
"""Set the lavalink server host."""
await self.config.host.set(host)
if await self._check_external():
@@ -3217,7 +6530,7 @@ class Audio(commands.Cog):
self._restart_connect()
@llsetup.command()
- async def password(self, ctx, password):
+ async def password(self, ctx: commands.Context, password: str):
"""Set the lavalink server password."""
await self.config.password.set(str(password))
if await self._check_external():
@@ -3235,7 +6548,7 @@ class Audio(commands.Cog):
self._restart_connect()
@llsetup.command()
- async def restport(self, ctx, rest_port: int):
+ async def restport(self, ctx: commands.Context, rest_port: int):
"""Set the lavalink REST server port."""
await self.config.rest_port.set(rest_port)
if await self._check_external():
@@ -3251,7 +6564,7 @@ class Audio(commands.Cog):
self._restart_connect()
@llsetup.command()
- async def wsport(self, ctx, ws_port: int):
+ async def wsport(self, ctx: commands.Context, ws_port: int):
"""Set the lavalink websocket server port."""
await self.config.ws_port.set(ws_port)
if await self._check_external():
@@ -3266,7 +6579,33 @@ class Audio(commands.Cog):
self._restart_connect()
- async def _channel_check(self, ctx):
+ @staticmethod
+ async def _apply_gain(guild_id: int, band, gain):
+ const = {
+ "op": "equalizer",
+ "guildId": str(guild_id),
+ "bands": [{"band": band, "gain": gain}],
+ }
+
+ try:
+ await lavalink.get_player(guild_id).node.send({**const})
+ except (KeyError, IndexError):
+ pass
+
+ @staticmethod
+ async def _apply_gains(guild_id: int, gains):
+ const = {
+ "op": "equalizer",
+ "guildId": str(guild_id),
+ "bands": [{"band": x, "gain": y} for x, y in enumerate(gains)],
+ }
+
+ try:
+ await lavalink.get_player(guild_id).node.send({**const})
+ except (KeyError, IndexError):
+ pass
+
+ async def _channel_check(self, ctx: commands.Context):
try:
player = lavalink.get_player(ctx.guild.id)
except KeyError:
@@ -3296,14 +6635,12 @@ class Audio(commands.Cog):
return False
async def _check_api_tokens(self):
- spotify = await self.bot.db.api_tokens.get_raw(
- "spotify", default={"client_id": "", "client_secret": ""}
- )
- youtube = await self.bot.db.api_tokens.get_raw("youtube", default={"api_key": ""})
+ spotify = await self.bot.get_shared_api_tokens("spotify")
+ youtube = await self.bot.get_shared_api_tokens("youtube")
return {
- "spotify_client_id": spotify["client_id"],
- "spotify_client_secret": spotify["client_secret"],
- "youtube_api": youtube["api_key"],
+ "spotify_client_id": spotify.get("client_id", ""),
+ "spotify_client_secret": spotify.get("client_secret", ""),
+ "youtube_api": youtube.get("api_key", ""),
}
async def _check_external(self):
@@ -3316,14 +6653,11 @@ class Audio(commands.Cog):
else:
return False
- @staticmethod
- async def _clear_react(message):
- try:
- await message.clear_reactions()
- except (discord.Forbidden, discord.HTTPException):
- return
+ async def _clear_react(self, message: discord.Message, emoji: dict = None):
+ """Non blocking version of clear_react"""
+ return self.bot.loop.create_task(clear_react(self.bot, message, emoji))
- async def _currency_check(self, ctx, jukebox_price: int):
+ async def _currency_check(self, ctx: commands.Context, jukebox_price: int):
jukebox = await self.config.guild(ctx.guild).jukebox()
if jukebox and not await self._can_instaskip(ctx, ctx.author):
try:
@@ -3334,143 +6668,214 @@ class Audio(commands.Cog):
await self._embed_msg(
ctx,
_("Not enough {currency} ({required_credits} required).").format(
- currency=credits_name, required_credits=jukebox_price
+ currency=credits_name, required_credits=humanize_number(jukebox_price)
),
)
return False
else:
return True
- async def _data_check(self, ctx):
+ async def _data_check(self, ctx: commands.Context):
player = lavalink.get_player(ctx.guild.id)
shuffle = await self.config.guild(ctx.guild).shuffle()
repeat = await self.config.guild(ctx.guild).repeat()
volume = await self.config.guild(ctx.guild).volume()
- if player.repeat != repeat:
- player.repeat = repeat
- if player.shuffle != shuffle:
- player.shuffle = shuffle
+ player.repeat = repeat
+ player.shuffle = shuffle
if player.volume != volume:
await player.set_volume(volume)
async def disconnect_timer(self):
stop_times = {}
-
+ pause_times = {}
while True:
for p in lavalink.all_players():
server = p.channel.guild
if [self.bot.user] == p.channel.members:
- stop_times.setdefault(server.id, int(time.time()))
+ stop_times.setdefault(server.id, time.time())
+ pause_times.setdefault(server.id, time.time())
else:
stop_times.pop(server.id, None)
-
- for sid in stop_times.copy():
+ if p.paused and server.id in pause_times:
+ try:
+ await p.pause(False)
+ except Exception:
+ log.error(
+ "Exception raised in Audio's emptypause_timer.", exc_info=True
+ )
+ finally:
+ pause_times.pop(server.id, None)
+ else:
+ pause_times.pop(server.id, None)
+ servers = stop_times.copy()
+ servers.update(pause_times)
+ for sid in servers:
server_obj = self.bot.get_guild(sid)
- if await self.config.guild(server_obj).emptydc_enabled():
+ if sid in stop_times and await self.config.guild(server_obj).emptydc_enabled():
emptydc_timer = await self.config.guild(server_obj).emptydc_timer()
- if (int(time.time()) - stop_times[sid]) >= emptydc_timer:
+ if (time.time() - stop_times[sid]) >= emptydc_timer:
stop_times.pop(sid)
try:
await lavalink.get_player(sid).disconnect()
except Exception:
- log.error(
- "Exception raised in Audio's disconnect_timer.", exc_info=True
- )
+ log.error("Exception raised in Audio's emptydc_timer.", exc_info=True)
pass
-
+ elif (
+ sid in pause_times and await self.config.guild(server_obj).emptypause_enabled()
+ ):
+ emptypause_timer = await self.config.guild(server_obj).emptypause_timer()
+ if (time.time() - pause_times.get(sid)) >= emptypause_timer:
+ try:
+ await lavalink.get_player(sid).pause()
+ except Exception:
+ log.error(
+ "Exception raised in Audio's emptypause_timer.", exc_info=True
+ )
await asyncio.sleep(5)
@staticmethod
- async def _draw_time(ctx):
- player = lavalink.get_player(ctx.guild.id)
- paused = player.paused
- pos = player.position
- dur = player.current.length
- sections = 12
- loc_time = round((pos / dur) * sections)
- bar = "\N{BOX DRAWINGS HEAVY HORIZONTAL}"
- seek = "\N{RADIO BUTTON}"
- if paused:
- msg = "\N{DOUBLE VERTICAL BAR}"
- else:
- msg = "\N{BLACK RIGHT-POINTING TRIANGLE}"
- for i in range(sections):
- if i == loc_time:
- msg += seek
- else:
- msg += bar
- return msg
-
- @staticmethod
- def _dynamic_time(time):
- m, s = divmod(time, 60)
- h, m = divmod(m, 60)
- d, h = divmod(h, 24)
-
- if d > 0:
- msg = "{0}d {1}h"
- elif d == 0 and h > 0:
- msg = "{1}h {2}m"
- elif d == 0 and h == 0 and m > 0:
- msg = "{2}m {3}s"
- elif d == 0 and h == 0 and m == 0 and s > 0:
- msg = "{3}s"
- else:
- msg = ""
- return msg.format(d, h, m, s)
-
- @staticmethod
- async def _embed_msg(ctx, title):
+ async def _embed_msg(ctx: commands.Context, title: str):
embed = discord.Embed(colour=await ctx.embed_colour(), title=title)
await ctx.send(embed=embed)
- async def _get_embed_colour(self, channel: discord.abc.GuildChannel):
- # Unfortunately we need this for when context is unavailable.
- if await self.bot.db.guild(channel.guild).use_bot_color():
- return channel.guild.me.color
- else:
- return self.bot.color
+ async def _eq_check(self, ctx: commands.Context, player: lavalink.Player):
+ eq = player.fetch("eq", Equalizer())
- async def _localtracks_folders(self, ctx):
- if not await self._localtracks_check(ctx):
- return
- localtracks_folders = sorted(
- (
- f
- for f in os.listdir(os.getcwd() + "/localtracks/")
- if not os.path.isfile(os.getcwd() + "/localtracks/" + f)
- ),
- key=lambda s: s.casefold(),
- )
- return localtracks_folders
+ config_bands = await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands()
+ if not config_bands:
+ config_bands = eq.bands
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
- @staticmethod
- def _match_url(url):
+ if eq.bands != config_bands:
+ band_num = list(range(0, eq._band_count))
+ band_value = config_bands
+ eq_dict = {}
+ for k, v in zip(band_num, band_value):
+ eq_dict[k] = v
+ for band, value in eq_dict.items():
+ eq.set_gain(band, value)
+ player.store("eq", eq)
+ await self._apply_gains(ctx.guild.id, config_bands)
+
+ async def _eq_interact(
+ self, ctx: commands.Context, player: lavalink.Player, eq, message, selected
+ ):
+ player.store("eq", eq)
+ emoji = {
+ "far_left": "◀",
+ "one_left": "⬅",
+ "max_output": "⏫",
+ "output_up": "🔼",
+ "output_down": "🔽",
+ "min_output": "⏬",
+ "one_right": "➡",
+ "far_right": "▶",
+ "reset": "⏺",
+ "info": "ℹ",
+ }
+ selector = f'{" " * 8}{" " * selected}^^'
try:
- query_url = urlparse(url)
- return all([query_url.scheme, query_url.netloc, query_url.path])
- except Exception:
- return False
+ await message.edit(content=box(f"{eq.visualise()}\n{selector}", lang="ini"))
+ except discord.errors.NotFound:
+ return
+ try:
+ react_emoji, react_user = await self._get_eq_reaction(ctx, message, emoji)
+ except TypeError:
+ return
+
+ if not react_emoji:
+ await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
+ await self._clear_react(message, emoji)
+
+ if react_emoji == "⬅":
+ await remove_react(message, react_emoji, react_user)
+ await self._eq_interact(ctx, player, eq, message, max(selected - 1, 0))
+
+ if react_emoji == "➡":
+ await remove_react(message, react_emoji, react_user)
+ await self._eq_interact(ctx, player, eq, message, min(selected + 1, 14))
+
+ if react_emoji == "🔼":
+ await remove_react(message, react_emoji, react_user)
+ _max = "{:.2f}".format(min(eq.get_gain(selected) + 0.1, 1.0))
+ eq.set_gain(selected, float(_max))
+ await self._apply_gain(ctx.guild.id, selected, _max)
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "🔽":
+ await remove_react(message, react_emoji, react_user)
+ _min = "{:.2f}".format(max(eq.get_gain(selected) - 0.1, -0.25))
+ eq.set_gain(selected, float(_min))
+ await self._apply_gain(ctx.guild.id, selected, _min)
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "⏫":
+ await remove_react(message, react_emoji, react_user)
+ _max = 1.0
+ eq.set_gain(selected, _max)
+ await self._apply_gain(ctx.guild.id, selected, _max)
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "⏬":
+ await remove_react(message, react_emoji, react_user)
+ _min = -0.25
+ eq.set_gain(selected, _min)
+ await self._apply_gain(ctx.guild.id, selected, _min)
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "◀":
+ await remove_react(message, react_emoji, react_user)
+ selected = 0
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "▶":
+ await remove_react(message, react_emoji, react_user)
+ selected = 14
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "⏺":
+ await remove_react(message, react_emoji, react_user)
+ for band in range(eq._band_count):
+ eq.set_gain(band, 0.0)
+ await self._apply_gains(ctx.guild.id, eq.bands)
+ await self._eq_interact(ctx, player, eq, message, selected)
+
+ if react_emoji == "ℹ":
+ await remove_react(message, react_emoji, react_user)
+ await ctx.send_help(self.eq)
+ await self._eq_interact(ctx, player, eq, message, selected)
@staticmethod
- def _match_yt_playlist(url):
- yt_list_playlist = re.compile(
- r"^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)"
- r"(\/playlist\?).*(list=)(.*)(&|$)"
- )
- if yt_list_playlist.match(url):
- return True
- return False
+ async def _eq_msg_clear(eq_message: discord.Message):
+ if eq_message is not None:
+ with contextlib.suppress(discord.HTTPException):
+ await eq_message.delete()
- def _play_lock(self, ctx, tf):
+ async def _get_eq_reaction(self, ctx: commands.Context, message: discord.Message, emoji):
+ try:
+ reaction, user = await self.bot.wait_for(
+ "reaction_add",
+ check=lambda r, u: r.message.id == message.id
+ and u.id == ctx.author.id
+ and r.emoji in emoji.values(),
+ timeout=30,
+ )
+ except asyncio.TimeoutError:
+ await self._clear_react(message, emoji)
+ return None
+ else:
+ return reaction.emoji, user
+
+ def _play_lock(self, ctx: commands.Context, tf):
if tf:
self.play_lock[ctx.message.guild.id] = True
else:
self.play_lock[ctx.message.guild.id] = False
- @staticmethod
- def _player_check(ctx):
+ def _player_check(self, ctx: commands.Context):
+ if self._connection_aborted:
+ return False
try:
lavalink.get_player(ctx.guild.id)
return True
@@ -3479,186 +6884,10 @@ class Audio(commands.Cog):
except KeyError:
return False
- @staticmethod
- async def _queue_duration(ctx):
- player = lavalink.get_player(ctx.guild.id)
- duration = []
- for i in range(len(player.queue)):
- if not player.queue[i].is_stream:
- duration.append(player.queue[i].length)
- queue_duration = sum(duration)
- if not player.queue:
- queue_duration = 0
- try:
- if not player.current.is_stream:
- remain = player.current.length - player.position
- else:
- remain = 0
- except AttributeError:
- remain = 0
- queue_total_duration = remain + queue_duration
- return queue_total_duration
-
- @staticmethod
- def _to_json(ctx, playlist_url, tracklist):
- playlist = {"author": ctx.author.id, "playlist_url": playlist_url, "tracks": tracklist}
- return playlist
-
- @staticmethod
- def _track_creator(player, position=None, other_track=None):
- if position == "np":
- queued_track = player.current
- elif position is None:
- queued_track = other_track
- else:
- queued_track = player.queue[position]
- track_keys = queued_track._info.keys()
- track_values = queued_track._info.values()
- track_id = queued_track.track_identifier
- track_info = {}
- for k, v in zip(track_keys, track_values):
- track_info[k] = v
- keys = ["track", "info"]
- values = [track_id, track_info]
- track_obj = {}
- for key, value in zip(keys, values):
- track_obj[key] = value
- return track_obj
-
- @staticmethod
- def _track_limit(ctx, track, maxlength):
- try:
- length = round(track.length / 1000)
- except AttributeError:
- length = round(track / 1000)
- if length > 900000000000000: # livestreams return 9223372036854775807ms
- return True
- elif length >= maxlength:
- return False
- else:
- return True
-
- async def _time_convert(self, length):
- match = re.compile(r"(?:(\d+):)?([0-5]?[0-9]):([0-5][0-9])").match(length)
- if match is not None:
- hr = int(match.group(1)) if match.group(1) else 0
- mn = int(match.group(2)) if match.group(2) else 0
- sec = int(match.group(3)) if match.group(3) else 0
- pos = sec + (mn * 60) + (hr * 3600)
- return pos * 1000
- else:
- try:
- return int(length) * 1000
- except ValueError:
- return 0
-
- @staticmethod
- def _url_check(url):
- valid_tld = [
- "youtube.com",
- "youtu.be",
- "soundcloud.com",
- "bandcamp.com",
- "vimeo.com",
- "mixer.com",
- "twitch.tv",
- "spotify.com",
- "localtracks",
- ]
- query_url = urlparse(url)
- url_domain = ".".join(query_url.netloc.split(".")[-2:])
- if not query_url.netloc:
- url_domain = ".".join(query_url.path.split("/")[0].split(".")[-2:])
- return True if url_domain in valid_tld else False
-
- @staticmethod
- def _userlimit(channel):
- if channel.user_limit == 0:
- return False
- if channel.user_limit < len(channel.members) + 1:
- return True
- else:
- return False
-
- async def _youtube_api_search(self, yt_key, query):
- params = {"q": query, "part": "id", "key": yt_key, "maxResults": 1, "type": "video"}
- yt_url = "https://www.googleapis.com/youtube/v3/search"
- try:
- async with self.session.request("GET", yt_url, params=params) as r:
- if r.status == 400:
- return None
- else:
- search_response = await r.json()
- except RuntimeError:
- return None
- for search_result in search_response.get("items", []):
- if search_result["id"]["kind"] == "youtube#video":
- return "https://www.youtube.com/watch?v={}".format(search_result["id"]["videoId"])
-
- # Spotify-related methods below are originally from: https://github.com/Just-Some-Bots/MusicBot/blob/master/musicbot/spotify.py
-
- async def _check_token(self, token):
- now = int(time.time())
- return token["expires_at"] - now < 60
-
- async def _get_spotify_token(self):
- if self.spotify_token and not await self._check_token(self.spotify_token):
- return self.spotify_token["access_token"]
- token = await self._request_token()
- if token is None:
- log.debug("Requested a token from Spotify, did not end up getting one.")
- try:
- token["expires_at"] = int(time.time()) + token["expires_in"]
- except KeyError:
- return
- self.spotify_token = token
- log.debug("Created a new access token for Spotify: {0}".format(token))
- return self.spotify_token["access_token"]
-
- async def _make_get(self, url, headers=None):
- async with self.session.request("GET", url, headers=headers) as r:
- if r.status != 200:
- log.debug(
- "Issue making GET request to {0}: [{1.status}] {2}".format(
- url, r, await r.json()
- )
- )
- return await r.json()
-
- async def _make_post(self, url, payload, headers=None):
- async with self.session.post(url, data=payload, headers=headers) as r:
- if r.status != 200:
- log.debug(
- "Issue making POST request to {0}: [{1.status}] {2}".format(
- url, r, await r.json()
- )
- )
- return await r.json()
-
- async def _make_spotify_req(self, url):
- token = await self._get_spotify_token()
- return await self._make_get(url, headers={"Authorization": "Bearer {0}".format(token)})
-
- def _make_token_auth(self, client_id, client_secret):
- auth_header = base64.b64encode((client_id + ":" + client_secret).encode("ascii"))
- return {"Authorization": "Basic %s" % auth_header.decode("ascii")}
-
- async def _request_token(self):
- self.client_id = await self.bot.db.api_tokens.get_raw("spotify", default={"client_id": ""})
- self.client_secret = await self.bot.db.api_tokens.get_raw(
- "spotify", default={"client_secret": ""}
- )
- payload = {"grant_type": "client_credentials"}
- headers = self._make_token_auth(
- self.client_id["client_id"], self.client_secret["client_secret"]
- )
- r = await self._make_post(
- "https://accounts.spotify.com/api/token", payload=payload, headers=headers
- )
- return r
-
@commands.Cog.listener()
- async def on_voice_state_update(self, member, before, after):
+ async def on_voice_state_update(
+ self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState
+ ):
if after.channel != before.channel:
try:
self.skip_votes[before.channel.guild].remove(member.id)
@@ -3667,8 +6896,9 @@ class Audio(commands.Cog):
def cog_unload(self):
if not self._cleaned_up:
- self.bot.loop.create_task(self.session.close())
-
+ self.bot.dispatch("red_audio_unload", self)
+ self.session.detach()
+ self.bot.loop.create_task(self._close_database())
if self._disconnect_task:
self._disconnect_task.cancel()
@@ -3679,6 +6909,60 @@ class Audio(commands.Cog):
self.bot.loop.create_task(lavalink.close())
if self._manager is not None:
self.bot.loop.create_task(self._manager.shutdown())
+
self._cleaned_up = True
+ @bump.error
+ @disconnect.error
+ @genre.error
+ @local_folder.error
+ @local_play.error
+ @local_search.error
+ @play.error
+ @prev.error
+ @search.error
+ @_playlist_append.error
+ @_playlist_save.error
+ @_playlist_update.error
+ @_playlist_upload.error
+ async def _clear_lock_on_error(self, ctx: commands.Context, error):
+ # TODO: Change this in a future PR
+ # FIXME: This seems to be consuming tracebacks and not adding them to last traceback
+ # which is handled by on_command_error
+ # Make it so that this can be used to show user friendly errors
+ if not isinstance(
+ getattr(error, "original", error),
+ (
+ commands.CheckFailure,
+ commands.UserInputError,
+ commands.DisabledCommand,
+ commands.CommandOnCooldown,
+ ),
+ ):
+ self._play_lock(ctx, False)
+ await self.music_cache.run_tasks(ctx)
+ message = "Error in command '{}'. Check your console or logs for details.".format(
+ ctx.command.qualified_name
+ )
+ await ctx.send(inline(message))
+ exception_log = "Exception in command '{}'\n" "".format(ctx.command.qualified_name)
+ exception_log += "".join(
+ traceback.format_exception(type(error), error, error.__traceback__)
+ )
+ self.bot._last_exception = exception_log
+
+ await ctx.bot.on_command_error(
+ ctx, getattr(error, "original", error), unhandled_by_cog=True
+ )
+
+ async def cog_after_invoke(self, ctx: commands.Context):
+ await self._process_db(ctx)
+
+ async def _process_db(self, ctx: commands.Context):
+ await self.music_cache.run_tasks(ctx)
+
+ async def _close_database(self):
+ await self.music_cache.run_all_pending_tasks()
+ await self.music_cache.close()
+
__del__ = cog_unload
diff --git a/redbot/cogs/audio/checks.py b/redbot/cogs/audio/checks.py
new file mode 100644
index 000000000..d6f9e6315
--- /dev/null
+++ b/redbot/cogs/audio/checks.py
@@ -0,0 +1,37 @@
+from redbot.core import Config, commands
+
+from .apis import HAS_SQL
+
+_config = None
+
+
+def _pass_config_to_checks(config: Config):
+ global _config
+ if _config is None:
+ _config = config
+
+
+def roomlocked():
+ """Deny the command if the bot has been room locked."""
+
+ async def predicate(ctx: commands.Context):
+ if ctx.guild is None:
+ return False
+ if await ctx.bot.is_mod(member=ctx.author):
+ return True
+
+ room_id = await _config.guild(ctx.guild).room_lock()
+ if room_id is None or ctx.channel.id == room_id:
+ return True
+ return False
+
+ return commands.check(predicate)
+
+
+def can_have_caching():
+ """Check to disable Caching commands if SQLite is not avaliable."""
+
+ async def predicate(ctx: commands.Context):
+ return HAS_SQL
+
+ return commands.check(predicate)
diff --git a/redbot/cogs/audio/converters.py b/redbot/cogs/audio/converters.py
new file mode 100644
index 000000000..05736cf8b
--- /dev/null
+++ b/redbot/cogs/audio/converters.py
@@ -0,0 +1,495 @@
+import argparse
+import functools
+from typing import Optional, Tuple, Union
+
+import discord
+
+from redbot.core import Config, commands
+from redbot.core.bot import Red
+from redbot.core.i18n import Translator
+
+from .playlists import PlaylistScope, standardize_scope
+
+_ = Translator("Audio", __file__)
+
+__all__ = [
+ "ComplexScopeParser",
+ "PlaylistConverter",
+ "ScopeParser",
+ "LazyGreedyConverter",
+ "standardize_scope",
+ "get_lazy_converter",
+ "get_playlist_converter",
+]
+
+_config = None
+_bot = None
+
+_SCOPE_HELP = """
+Scope must be a valid version of one of the following:
+ Global
+ Guild
+ User
+"""
+_USER_HELP = """
+Author must be a valid version of one of the following:
+ User ID
+ User Mention
+ User Name#123
+"""
+_GUILD_HELP = """
+Guild must be a valid version of one of the following:
+ Guild ID
+ Exact guild name
+"""
+
+
+def _pass_config_to_converters(config: Config, bot: Red):
+ global _config, _bot
+ if _config is None:
+ _config = config
+ if _bot is None:
+ _bot = bot
+
+
+class PlaylistConverter(commands.Converter):
+ async def convert(self, ctx: commands.Context, arg: str) -> dict:
+ global_scope = await _config.custom(PlaylistScope.GLOBAL.value).all()
+ guild_scope = await _config.custom(PlaylistScope.GUILD.value).all()
+ user_scope = await _config.custom(PlaylistScope.USER.value).all()
+ user_matches = [
+ (uid, pid, pdata)
+ for uid, data in user_scope.items()
+ for pid, pdata in data.items()
+ if arg == pid or arg.lower() in pdata.get("name", "").lower()
+ ]
+ guild_matches = [
+ (gid, pid, pdata)
+ for gid, data in guild_scope.items()
+ for pid, pdata in data.items()
+ if arg == pid or arg.lower() in pdata.get("name", "").lower()
+ ]
+ global_matches = [
+ (None, pid, pdata)
+ for pid, pdata in global_scope.items()
+ if arg == pid or arg.lower() in pdata.get("name", "").lower()
+ ]
+ if not user_matches and not guild_matches and not global_matches:
+ raise commands.BadArgument(_("Could not match '{}' to a playlist.").format(arg))
+
+ return {
+ PlaylistScope.GLOBAL.value: global_matches,
+ PlaylistScope.GUILD.value: guild_matches,
+ PlaylistScope.USER.value: user_matches,
+ "arg": arg,
+ }
+
+
+class NoExitParser(argparse.ArgumentParser):
+ def error(self, message):
+ raise commands.BadArgument()
+
+
+class ScopeParser(commands.Converter):
+ async def convert(
+ self, ctx: commands.Context, argument: str
+ ) -> Tuple[str, discord.User, Optional[discord.Guild], bool]:
+ target_scope: str = PlaylistScope.GUILD.value
+ target_user: Optional[Union[discord.Member, discord.User]] = ctx.author
+ target_guild: Optional[discord.Guild] = ctx.guild
+ specified_user = False
+
+ argument = argument.replace("—", "--")
+
+ command, *arguments = argument.split(" -- ")
+ if arguments:
+ argument = " -- ".join(arguments)
+ else:
+ command = None
+
+ parser = NoExitParser(description="Playlist Scope Parsing.", add_help=False)
+
+ parser.add_argument("--scope", nargs="*", dest="scope", default=[])
+ parser.add_argument("--guild", nargs="*", dest="guild", default=[])
+ parser.add_argument("--server", nargs="*", dest="guild", default=[])
+ parser.add_argument("--author", nargs="*", dest="author", default=[])
+ parser.add_argument("--user", nargs="*", dest="author", default=[])
+ parser.add_argument("--member", nargs="*", dest="author", default=[])
+
+ if not command:
+ parser.add_argument("command", nargs="*")
+
+ try:
+ vals = vars(parser.parse_args(argument.split()))
+ except Exception as exc:
+ raise commands.BadArgument() from exc
+
+ if vals["scope"]:
+ scope_raw = " ".join(vals["scope"]).strip()
+ scope = scope_raw.upper().strip()
+ valid_scopes = PlaylistScope.list() + [
+ "GLOBAL",
+ "GUILD",
+ "AUTHOR",
+ "USER",
+ "SERVER",
+ "MEMBER",
+ "BOT",
+ ]
+ if scope not in valid_scopes:
+ raise commands.ArgParserFailure("--scope", scope_raw, custom_help=_SCOPE_HELP)
+ target_scope = standardize_scope(scope)
+ elif "--scope" in argument and not vals["scope"]:
+ raise commands.ArgParserFailure("--scope", "Nothing", custom_help=_SCOPE_HELP)
+
+ is_owner = await ctx.bot.is_owner(ctx.author)
+ guild = vals.get("guild", None) or vals.get("server", None)
+ if is_owner and guild:
+ target_guild = None
+ guild_raw = " ".join(guild).strip()
+ if guild_raw.isnumeric():
+ guild_raw = int(guild_raw)
+ try:
+ target_guild = ctx.bot.get_guild(guild_raw)
+ except Exception:
+ target_guild = None
+ guild_raw = str(guild_raw)
+ if target_guild is None:
+ try:
+ target_guild = await commands.GuildConverter.convert(ctx, guild_raw)
+ except Exception:
+ target_guild = None
+ if target_guild is None:
+ try:
+ target_guild = await ctx.bot.fetch_guild(guild_raw)
+ except Exception:
+ target_guild = None
+ if target_guild is None:
+ raise commands.ArgParserFailure("--guild", guild_raw, custom_help=_GUILD_HELP)
+ elif not is_owner and (guild or any(x in argument for x in ["--guild", "--server"])):
+ raise commands.BadArgument("You cannot use `--guild`")
+ elif any(x in argument for x in ["--guild", "--server"]):
+ raise commands.ArgParserFailure("--guild", "Nothing", custom_help=_GUILD_HELP)
+
+ author = vals.get("author", None) or vals.get("user", None) or vals.get("member", None)
+ if author:
+ target_user = None
+ user_raw = " ".join(author).strip()
+ if user_raw.isnumeric():
+ user_raw = int(user_raw)
+ try:
+ target_user = ctx.bot.get_user(user_raw)
+ except Exception:
+ target_user = None
+ user_raw = str(user_raw)
+ if target_user is None:
+ member_converter = commands.MemberConverter()
+ user_converter = commands.UserConverter()
+ try:
+ target_user = await member_converter.convert(ctx, user_raw)
+ except Exception:
+ try:
+ target_user = await user_converter.convert(ctx, user_raw)
+ except Exception:
+ target_user = None
+ if target_user is None:
+ try:
+ target_user = await ctx.bot.fetch_user(user_raw)
+ except Exception:
+ target_user = None
+ if target_user is None:
+ raise commands.ArgParserFailure("--author", user_raw, custom_help=_USER_HELP)
+ else:
+ specified_user = True
+ elif any(x in argument for x in ["--author", "--user", "--member"]):
+ raise commands.ArgParserFailure("--scope", "Nothing", custom_help=_USER_HELP)
+
+ return target_scope, target_user, target_guild, specified_user
+
+
+class ComplexScopeParser(commands.Converter):
+ async def convert(
+ self, ctx: commands.Context, argument: str
+ ) -> Tuple[
+ str,
+ discord.User,
+ Optional[discord.Guild],
+ bool,
+ str,
+ discord.User,
+ Optional[discord.Guild],
+ bool,
+ ]:
+
+ target_scope: str = PlaylistScope.GUILD.value
+ target_user: Optional[Union[discord.Member, discord.User]] = ctx.author
+ target_guild: Optional[discord.Guild] = ctx.guild
+ specified_target_user = False
+
+ source_scope: str = PlaylistScope.GUILD.value
+ source_user: Optional[Union[discord.Member, discord.User]] = ctx.author
+ source_guild: Optional[discord.Guild] = ctx.guild
+ specified_source_user = False
+
+ argument = argument.replace("—", "--")
+
+ command, *arguments = argument.split(" -- ")
+ if arguments:
+ argument = " -- ".join(arguments)
+ else:
+ command = None
+
+ parser = NoExitParser(description="Playlist Scope Parsing.", add_help=False)
+
+ parser.add_argument("--to-scope", nargs="*", dest="to_scope", default=[])
+ parser.add_argument("--to-guild", nargs="*", dest="to_guild", default=[])
+ parser.add_argument("--to-server", nargs="*", dest="to_server", default=[])
+ parser.add_argument("--to-author", nargs="*", dest="to_author", default=[])
+ parser.add_argument("--to-user", nargs="*", dest="to_user", default=[])
+ parser.add_argument("--to-member", nargs="*", dest="to_member", default=[])
+
+ parser.add_argument("--from-scope", nargs="*", dest="from_scope", default=[])
+ parser.add_argument("--from-guild", nargs="*", dest="from_guild", default=[])
+ parser.add_argument("--from-server", nargs="*", dest="from_server", default=[])
+ parser.add_argument("--from-author", nargs="*", dest="from_author", default=[])
+ parser.add_argument("--from-user", nargs="*", dest="from_user", default=[])
+ parser.add_argument("--from-member", nargs="*", dest="from_member", default=[])
+
+ if not command:
+ parser.add_argument("command", nargs="*")
+
+ try:
+ vals = vars(parser.parse_args(argument.split()))
+ except Exception as exc:
+ raise commands.BadArgument() from exc
+
+ is_owner = await ctx.bot.is_owner(ctx.author)
+ valid_scopes = PlaylistScope.list() + [
+ "GLOBAL",
+ "GUILD",
+ "AUTHOR",
+ "USER",
+ "SERVER",
+ "MEMBER",
+ "BOT",
+ ]
+
+ if vals["to_scope"]:
+ to_scope_raw = " ".join(vals["to_scope"]).strip()
+ to_scope = to_scope_raw.upper().strip()
+ if to_scope not in valid_scopes:
+ raise commands.ArgParserFailure(
+ "--to-scope", to_scope_raw, custom_help=_SCOPE_HELP
+ )
+ target_scope = standardize_scope(to_scope)
+ elif "--to-scope" in argument and not vals["to_scope"]:
+ raise commands.ArgParserFailure("--to-scope", "Nothing", custom_help=_SCOPE_HELP)
+
+ if vals["from_scope"]:
+ from_scope_raw = " ".join(vals["from_scope"]).strip()
+ from_scope = from_scope_raw.upper().strip()
+
+ if from_scope not in valid_scopes:
+ raise commands.ArgParserFailure(
+ "--from-scope", from_scope_raw, custom_help=_SCOPE_HELP
+ )
+ source_scope = standardize_scope(from_scope)
+ elif "--from-scope" in argument and not vals["to_scope"]:
+ raise commands.ArgParserFailure("--to-scope", "Nothing", custom_help=_SCOPE_HELP)
+
+ to_guild = vals.get("to_guild", None) or vals.get("to_server", None)
+ if is_owner and to_guild:
+ target_guild = None
+ to_guild_raw = " ".join(to_guild).strip()
+ if to_guild_raw.isnumeric():
+ to_guild_raw = int(to_guild_raw)
+ try:
+ target_guild = ctx.bot.get_guild(to_guild_raw)
+ except Exception:
+ target_guild = None
+ to_guild_raw = str(to_guild_raw)
+ if target_guild is None:
+ try:
+ target_guild = await commands.GuildConverter.convert(ctx, to_guild_raw)
+ except Exception:
+ target_guild = None
+ if target_guild is None:
+ try:
+ target_guild = await ctx.bot.fetch_guild(to_guild_raw)
+ except Exception:
+ target_guild = None
+ if target_guild is None:
+ raise commands.ArgParserFailure(
+ "--to-guild", to_guild_raw, custom_help=_GUILD_HELP
+ )
+ elif not is_owner and (
+ to_guild or any(x in argument for x in ["--to-guild", "--to-server"])
+ ):
+ raise commands.BadArgument("You cannot use `--to-server`")
+ elif any(x in argument for x in ["--to-guild", "--to-server"]):
+ raise commands.ArgParserFailure("--to-server", "Nothing", custom_help=_GUILD_HELP)
+
+ from_guild = vals.get("from_guild", None) or vals.get("from_server", None)
+ if is_owner and from_guild:
+ source_guild = None
+ from_guild_raw = " ".join(from_guild).strip()
+ if from_guild_raw.isnumeric():
+ from_guild_raw = int(from_guild_raw)
+ try:
+ source_guild = ctx.bot.get_guild(from_guild_raw)
+ except Exception:
+ source_guild = None
+ from_guild_raw = str(from_guild_raw)
+ if source_guild is None:
+ try:
+ source_guild = await commands.GuildConverter.convert(ctx, from_guild_raw)
+ except Exception:
+ source_guild = None
+ if source_guild is None:
+ try:
+ source_guild = await ctx.bot.fetch_guild(from_guild_raw)
+ except Exception:
+ source_guild = None
+ if source_guild is None:
+ raise commands.ArgParserFailure(
+ "--from-guild", from_guild_raw, custom_help=_GUILD_HELP
+ )
+ elif not is_owner and (
+ from_guild or any(x in argument for x in ["--from-guild", "--from-server"])
+ ):
+ raise commands.BadArgument("You cannot use `--from-server`")
+ elif any(x in argument for x in ["--from-guild", "--from-server"]):
+ raise commands.ArgParserFailure("--from-server", "Nothing", custom_help=_GUILD_HELP)
+
+ to_author = (
+ vals.get("to_author", None) or vals.get("to_user", None) or vals.get("to_member", None)
+ )
+ if to_author:
+ target_user = None
+ to_user_raw = " ".join(to_author).strip()
+ if to_user_raw.isnumeric():
+ to_user_raw = int(to_user_raw)
+ try:
+ source_user = ctx.bot.get_user(to_user_raw)
+ except Exception:
+ source_user = None
+ to_user_raw = str(to_user_raw)
+ if target_user is None:
+ member_converter = commands.MemberConverter()
+ user_converter = commands.UserConverter()
+ try:
+ target_user = await member_converter.convert(ctx, to_user_raw)
+ except Exception:
+ try:
+ target_user = await user_converter.convert(ctx, to_user_raw)
+ except Exception:
+ target_user = None
+ if target_user is None:
+ try:
+ target_user = await ctx.bot.fetch_user(to_user_raw)
+ except Exception:
+ target_user = None
+ if target_user is None:
+ raise commands.ArgParserFailure("--to-author", to_user_raw, custom_help=_USER_HELP)
+ else:
+ specified_target_user = True
+ elif any(x in argument for x in ["--to-author", "--to-user", "--to-member"]):
+ raise commands.ArgParserFailure("--to-user", "Nothing", custom_help=_USER_HELP)
+
+ from_author = (
+ vals.get("from_author", None)
+ or vals.get("from_user", None)
+ or vals.get("from_member", None)
+ )
+ if from_author:
+ source_user = None
+ from_user_raw = " ".join(from_author).strip()
+ if from_user_raw.isnumeric():
+ from_user_raw = int(from_user_raw)
+ try:
+ target_user = ctx.bot.get_user(from_user_raw)
+ except Exception:
+ source_user = None
+ from_user_raw = str(from_user_raw)
+ if source_user is None:
+ member_converter = commands.MemberConverter()
+ user_converter = commands.UserConverter()
+ try:
+ source_user = await member_converter.convert(ctx, from_user_raw)
+ except Exception:
+ try:
+ source_user = await user_converter.convert(ctx, from_user_raw)
+ except Exception:
+ source_user = None
+ if source_user is None:
+ try:
+ source_user = await ctx.bot.fetch_user(from_user_raw)
+ except Exception:
+ source_user = None
+ if source_user is None:
+ raise commands.ArgParserFailure(
+ "--from-author", from_user_raw, custom_help=_USER_HELP
+ )
+ else:
+ specified_source_user = True
+ elif any(x in argument for x in ["--from-author", "--from-user", "--from-member"]):
+ raise commands.ArgParserFailure("--from-user", "Nothing", custom_help=_USER_HELP)
+
+ return (
+ source_scope,
+ source_user,
+ source_guild,
+ specified_source_user,
+ target_scope,
+ target_user,
+ target_guild,
+ specified_target_user,
+ )
+
+
+class LazyGreedyConverter(commands.Converter):
+ def __init__(self, splitter: str):
+ self.splitter_Value = splitter
+
+ async def convert(self, ctx: commands.Context, argument: str) -> str:
+ full_message = ctx.message.content.partition(f" {argument} ")
+ if len(full_message) == 1:
+ full_message = (
+ (argument if argument not in full_message else "") + " " + full_message[0]
+ )
+ elif len(full_message) > 1:
+ full_message = (
+ (argument if argument not in full_message else "") + " " + full_message[-1]
+ )
+ greedy_output = (" " + full_message.replace("—", "--")).partition(
+ f" {self.splitter_Value}"
+ )[0]
+ return f"{greedy_output}".strip()
+
+
+def get_lazy_converter(splitter: str) -> type:
+ """
+ Returns a typechecking safe `LazyGreedyConverter` suitable for use with discord.py.
+ """
+
+ class PartialMeta(type(LazyGreedyConverter)):
+ __call__ = functools.partialmethod(type(LazyGreedyConverter).__call__, splitter)
+
+ class ValidatedConverter(LazyGreedyConverter, metaclass=PartialMeta):
+ pass
+
+ return ValidatedConverter
+
+
+def get_playlist_converter() -> type:
+ """
+ Returns a typechecking safe `PlaylistConverter` suitable for use with discord.py.
+ """
+
+ class PartialMeta(type(PlaylistConverter)):
+ __call__ = functools.partialmethod(type(PlaylistConverter).__call__)
+
+ class ValidatedConverter(PlaylistConverter, metaclass=PartialMeta):
+ pass
+
+ return ValidatedConverter
diff --git a/redbot/cogs/audio/dataclasses.py b/redbot/cogs/audio/dataclasses.py
new file mode 100644
index 000000000..eee695aa5
--- /dev/null
+++ b/redbot/cogs/audio/dataclasses.py
@@ -0,0 +1,486 @@
+import os
+import re
+from pathlib import Path, PosixPath, WindowsPath
+from typing import List, Optional, Union
+from urllib.parse import urlparse
+
+import lavalink
+
+from redbot.core import Config
+from redbot.core.bot import Red
+from redbot.core.i18n import Translator
+
+_config: Optional[Config] = None
+_bot: Optional[Red] = None
+_localtrack_folder: Optional[str] = None
+_ = Translator("Audio", __file__)
+_remove_start = re.compile(r"^(sc|list) ")
+_re_youtube_timestamp = re.compile(r"&t=(\d+)s?")
+_re_youtube_index = re.compile(r"&index=(\d+)")
+_re_spotify_url = re.compile(r"(http[s]?://)?(open.spotify.com)/")
+_re_spotify_timestamp = re.compile(r"#(\d+):(\d+)")
+_re_soundcloud_timestamp = re.compile(r"#t=(\d+):(\d+)s?")
+_re_twitch_timestamp = re.compile(r"\?t=(\d+)h(\d+)m(\d+)s")
+
+
+def _pass_config_to_dataclasses(config: Config, bot: Red, folder: str):
+ global _config, _bot, _localtrack_folder
+ if _config is None:
+ _config = config
+ if _bot is None:
+ _bot = bot
+ _localtrack_folder = folder
+
+
+class ChdirClean(object):
+ def __init__(self, directory):
+ self.old_dir = os.getcwd()
+ self.new_dir = directory
+ self.cwd = None
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, _type, value, traceback):
+ self.chdir_out()
+ return isinstance(value, OSError)
+
+ def chdir_in(self):
+ self.cwd = Path(self.new_dir)
+ os.chdir(self.new_dir)
+
+ def chdir_out(self):
+ self.cwd = Path(self.old_dir)
+ os.chdir(self.old_dir)
+
+
+class LocalPath(ChdirClean):
+ """
+ Local tracks class.
+ Used to handle system dir trees in a cross system manner.
+ The only use of this class is for `localtracks`.
+ """
+
+ _supported_music_ext = (".mp3", ".flac", ".ogg")
+
+ def __init__(self, path, **kwargs):
+ self._path = path
+ if isinstance(path, (Path, WindowsPath, PosixPath, LocalPath)):
+ path = str(path.absolute())
+ elif path is not None:
+ path = str(path)
+
+ self.cwd = Path.cwd()
+ _lt_folder = Path(_localtrack_folder) if _localtrack_folder else self.cwd
+ _path = Path(path) if path else self.cwd
+
+ if _lt_folder.parts[-1].lower() == "localtracks" and not kwargs.get("forced"):
+ self.localtrack_folder = _lt_folder
+ elif kwargs.get("forced"):
+ if _path.parts[-1].lower() == "localtracks":
+ self.localtrack_folder = _path
+ else:
+ self.localtrack_folder = _path / "localtracks"
+ else:
+ self.localtrack_folder = _lt_folder / "localtracks"
+
+ try:
+ _path = Path(path)
+ _path.relative_to(self.localtrack_folder)
+ self.path = _path
+ except (ValueError, TypeError):
+ if path and path.startswith("localtracks//"):
+ path = path.replace("localtracks//", "", 1)
+ elif path and path.startswith("localtracks/"):
+ path = path.replace("localtracks/", "", 1)
+ self.path = self.localtrack_folder.joinpath(path) if path else self.localtrack_folder
+
+ try:
+ if self.path.is_file():
+ parent = self.path.parent
+ else:
+ parent = self.path
+ super().__init__(str(parent.absolute()))
+
+ self.parent = Path(parent)
+ except OSError:
+ self.parent = None
+
+ self.cwd = Path.cwd()
+
+ @property
+ def name(self):
+ return str(self.path.name)
+
+ def is_dir(self):
+ try:
+ return self.path.is_dir()
+ except OSError:
+ return False
+
+ def exists(self):
+ try:
+ return self.path.exists()
+ except OSError:
+ return False
+
+ def is_file(self):
+ try:
+ return self.path.is_file()
+ except OSError:
+ return False
+
+ def absolute(self):
+ try:
+ return self.path.absolute()
+ except OSError:
+ return self._path
+
+ @classmethod
+ def joinpath(cls, *args):
+ modified = cls(None)
+ modified.path = modified.path.joinpath(*args)
+ return modified
+
+ def multiglob(self, *patterns):
+ paths = []
+ for p in patterns:
+ paths.extend(list(self.path.glob(p)))
+ for p in self._filtered(paths):
+ yield p
+
+ def multirglob(self, *patterns):
+ paths = []
+ for p in patterns:
+ paths.extend(list(self.path.rglob(p)))
+
+ for p in self._filtered(paths):
+ yield p
+
+ def _filtered(self, paths: List[Path]):
+ for p in paths:
+ if p.suffix in self._supported_music_ext:
+ yield p
+
+ def __str__(self):
+ return str(self.path.absolute())
+
+ def to_string(self):
+ try:
+ return str(self.path.absolute())
+ except OSError:
+ return str(self._path)
+
+ def to_string_hidden(self, arg: str = None):
+ string = str(self.absolute()).replace(
+ (str(self.localtrack_folder.absolute()) + os.sep) if arg is None else arg, ""
+ )
+ chunked = False
+ while len(string) > 145 and os.sep in string:
+ string = string.split(os.sep, 1)[-1]
+ chunked = True
+
+ if chunked:
+ string = f"...{os.sep}{string}"
+ return string
+
+ def tracks_in_tree(self):
+ tracks = []
+ for track in self.multirglob(*[f"*{ext}" for ext in self._supported_music_ext]):
+ if track.exists() and track.is_file() and track.parent != self.localtrack_folder:
+ tracks.append(Query.process_input(LocalPath(str(track.absolute()))))
+ return tracks
+
+ def subfolders_in_tree(self):
+ files = list(self.multirglob(*[f"*{ext}" for ext in self._supported_music_ext]))
+ folders = []
+ for f in files:
+ if f.exists() and f.parent not in folders and f.parent != self.localtrack_folder:
+ folders.append(f.parent)
+ return_folders = []
+ for folder in folders:
+ if folder.exists() and folder.is_dir():
+ return_folders.append(LocalPath(str(folder.absolute())))
+ return return_folders
+
+ def tracks_in_folder(self):
+ tracks = []
+ for track in self.multiglob(*[f"*{ext}" for ext in self._supported_music_ext]):
+ if track.exists() and track.is_file() and track.parent != self.localtrack_folder:
+ tracks.append(Query.process_input(LocalPath(str(track.absolute()))))
+ return tracks
+
+ def subfolders(self):
+ files = list(self.multiglob(*[f"*{ext}" for ext in self._supported_music_ext]))
+ folders = []
+ for f in files:
+ if f.exists() and f.parent not in folders and f.parent != self.localtrack_folder:
+ folders.append(f.parent)
+ return_folders = []
+ for folder in folders:
+ if folder.exists() and folder.is_dir():
+ return_folders.append(LocalPath(str(folder.absolute())))
+ return return_folders
+
+
+class Query:
+ """
+ Query data class.
+ Use: Query.process_input(query) to generate the Query object.
+ """
+
+ def __init__(self, query: Union[LocalPath, str], **kwargs):
+ query = kwargs.get("queryforced", query)
+ self._raw: Union[LocalPath, str] = query
+
+ _localtrack: LocalPath = LocalPath(query)
+
+ self.track: Union[LocalPath, str] = _localtrack if (
+ (_localtrack.is_file() or _localtrack.is_dir()) and _localtrack.exists()
+ ) else query
+
+ self.valid: bool = query != "InvalidQueryPlaceHolderName"
+ self.is_local: bool = kwargs.get("local", False)
+ self.is_spotify: bool = kwargs.get("spotify", False)
+ self.is_youtube: bool = kwargs.get("youtube", False)
+ self.is_soundcloud: bool = kwargs.get("soundcloud", False)
+ self.is_bandcamp: bool = kwargs.get("bandcamp", False)
+ self.is_vimeo: bool = kwargs.get("vimeo", False)
+ self.is_mixer: bool = kwargs.get("mixer", False)
+ self.is_twitch: bool = kwargs.get("twitch", False)
+ self.is_other: bool = kwargs.get("other", False)
+ self.is_playlist: bool = kwargs.get("playlist", False)
+ self.is_album: bool = kwargs.get("album", False)
+ self.is_search: bool = kwargs.get("search", False)
+ self.is_stream: bool = kwargs.get("stream", False)
+ self.single_track: bool = kwargs.get("single", False)
+ self.id: Optional[str] = kwargs.get("id", None)
+ self.invoked_from: Optional[str] = kwargs.get("invoked_from", None)
+ self.local_name: Optional[str] = kwargs.get("name", None)
+ self.search_subfolders: bool = kwargs.get("search_subfolders", False)
+ self.spotify_uri: Optional[str] = kwargs.get("uri", None)
+
+ self.start_time: int = kwargs.get("start_time", 0)
+ self.track_index: Optional[int] = kwargs.get("track_index", None)
+
+ if self.invoked_from == "sc search":
+ self.is_youtube = False
+ self.is_soundcloud = True
+
+ self.lavalink_query: str = self._get_query()
+
+ if self.is_playlist or self.is_album:
+ self.single_track = False
+
+ def __str__(self):
+ return str(self.lavalink_query)
+
+ @classmethod
+ def process_input(cls, query: Union[LocalPath, lavalink.Track, "Query", str], **kwargs):
+ """
+ A replacement for :code:`lavalink.Player.load_tracks`.
+ This will try to get a valid cached entry first if not found or if in valid
+ it will then call the lavalink API.
+
+ Parameters
+ ----------
+ query : Union[Query, LocalPath, lavalink.Track, str]
+ The query string or LocalPath object.
+ Returns
+ -------
+ Query
+ Returns a parsed Query object.
+ """
+ if not query:
+ query = "InvalidQueryPlaceHolderName"
+ possible_values = dict()
+
+ if isinstance(query, str):
+ query = query.strip("<>")
+
+ elif isinstance(query, Query):
+ for key, val in kwargs.items():
+ setattr(query, key, val)
+ return query
+ elif isinstance(query, lavalink.Track):
+ possible_values["stream"] = query.is_stream
+ query = query.uri
+
+ possible_values.update(dict(**kwargs))
+ possible_values.update(cls._parse(query, **kwargs))
+ return cls(query, **possible_values)
+
+ @staticmethod
+ def _parse(track, **kwargs):
+ returning = {}
+ if (
+ type(track) == type(LocalPath)
+ and (track.is_file() or track.is_dir())
+ and track.exists()
+ ):
+ returning["local"] = True
+ returning["name"] = track.name
+ if track.is_file():
+ returning["single"] = True
+ elif track.is_dir():
+ returning["album"] = True
+ else:
+ track = str(track)
+ if track.startswith("spotify:"):
+ returning["spotify"] = True
+ if ":playlist:" in track:
+ returning["playlist"] = True
+ elif ":album:" in track:
+ returning["album"] = True
+ elif ":track:" in track:
+ returning["single"] = True
+ _id = track.split(":", 2)[-1]
+ _id = _id.split("?")[0]
+ returning["id"] = _id
+ if "#" in _id:
+ match = re.search(_re_spotify_timestamp, track)
+ if match:
+ returning["start_time"] = (int(match.group(1)) * 60) + int(match.group(2))
+ returning["uri"] = track
+ return returning
+ if track.startswith("sc ") or track.startswith("list "):
+ if track.startswith("sc "):
+ returning["invoked_from"] = "sc search"
+ returning["soundcloud"] = True
+ elif track.startswith("list "):
+ returning["invoked_from"] = "search list"
+ track = _remove_start.sub("", track, 1)
+ returning["queryforced"] = track
+
+ _localtrack = LocalPath(track)
+ if _localtrack.exists():
+ if _localtrack.is_file():
+ returning["local"] = True
+ returning["single"] = True
+ returning["name"] = _localtrack.name
+ return returning
+ elif _localtrack.is_dir():
+ returning["album"] = True
+ returning["local"] = True
+ returning["name"] = _localtrack.name
+ return returning
+ try:
+ query_url = urlparse(track)
+ if all([query_url.scheme, query_url.netloc, query_url.path]):
+ url_domain = ".".join(query_url.netloc.split(".")[-2:])
+ if not query_url.netloc:
+ url_domain = ".".join(query_url.path.split("/")[0].split(".")[-2:])
+ if url_domain in ["youtube.com", "youtu.be"]:
+ returning["youtube"] = True
+ _has_index = "&index=" in track
+ if "&t=" in track:
+ match = re.search(_re_youtube_timestamp, track)
+ if match:
+ returning["start_time"] = int(match.group(1))
+ if _has_index:
+ match = re.search(_re_youtube_index, track)
+ if match:
+ returning["track_index"] = int(match.group(1)) - 1
+
+ if all(k in track for k in ["&list=", "watch?"]):
+ returning["track_index"] = 0
+ returning["playlist"] = True
+ returning["single"] = False
+ elif all(x in track for x in ["playlist?"]):
+ returning["playlist"] = True if not _has_index else False
+ returning["single"] = True if _has_index else False
+ else:
+ returning["single"] = True
+ elif url_domain == "spotify.com":
+ returning["spotify"] = True
+ if "/playlist/" in track:
+ returning["playlist"] = True
+ elif "/album/" in track:
+ returning["album"] = True
+ elif "/track/" in track:
+ returning["single"] = True
+ val = re.sub(_re_spotify_url, "", track).replace("/", ":")
+ if "user:" in val:
+ val = val.split(":", 2)[-1]
+ _id = val.split(":", 1)[-1]
+ _id = _id.split("?")[0]
+
+ if "#" in _id:
+ _id = _id.split("#")[0]
+ match = re.search(_re_spotify_timestamp, track)
+ if match:
+ returning["start_time"] = (int(match.group(1)) * 60) + int(
+ match.group(2)
+ )
+
+ returning["id"] = _id
+ returning["uri"] = f"spotify:{val}"
+ elif url_domain == "soundcloud.com":
+ returning["soundcloud"] = True
+ if "#t=" in track:
+ match = re.search(_re_soundcloud_timestamp, track)
+ if match:
+ returning["start_time"] = (int(match.group(1)) * 60) + int(
+ match.group(2)
+ )
+ if "/sets/" in track:
+ if "?in=" in track:
+ returning["single"] = True
+ else:
+ returning["playlist"] = True
+ else:
+ returning["single"] = True
+ elif url_domain == "bandcamp.com":
+ returning["bandcamp"] = True
+ if "/album/" in track:
+ returning["album"] = True
+ else:
+ returning["single"] = True
+ elif url_domain == "vimeo.com":
+ returning["vimeo"] = True
+ elif url_domain in ["mixer.com", "beam.pro"]:
+ returning["mixer"] = True
+ elif url_domain == "twitch.tv":
+ returning["twitch"] = True
+ if "?t=" in track:
+ match = re.search(_re_twitch_timestamp, track)
+ if match:
+ returning["start_time"] = (
+ (int(match.group(1)) * 60 * 60)
+ + (int(match.group(2)) * 60)
+ + int(match.group(3))
+ )
+
+ if not any(x in track for x in ["/clip/", "/videos/"]):
+ returning["stream"] = True
+ else:
+ returning["other"] = True
+ returning["single"] = True
+ else:
+ if kwargs.get("soundcloud", False):
+ returning["soundcloud"] = True
+ else:
+ returning["youtube"] = True
+ returning["search"] = True
+ returning["single"] = True
+ except Exception:
+ returning["search"] = True
+ returning["youtube"] = True
+ returning["single"] = True
+ return returning
+
+ def _get_query(self):
+ if self.is_local:
+ return self.track.to_string()
+ elif self.is_spotify:
+ return self.spotify_uri
+ elif self.is_search and self.is_youtube:
+ return f"ytsearch:{self.track}"
+ elif self.is_search and self.is_soundcloud:
+ return f"scsearch:{self.track}"
+ return self.track
+
+ def to_string_user(self):
+ if self.is_local:
+ return str(self.track.to_string_hidden())
+ return str(self._raw)
diff --git a/redbot/cogs/audio/equalizer.py b/redbot/cogs/audio/equalizer.py
new file mode 100644
index 000000000..ee3cb62fb
--- /dev/null
+++ b/redbot/cogs/audio/equalizer.py
@@ -0,0 +1,47 @@
+# The equalizer class and some audio eq functions are derived from
+# 180093157554388993's work, with his permission
+
+
+class Equalizer:
+ def __init__(self):
+ self._band_count = 15
+ self.bands = [0.0 for _ in range(self._band_count)]
+
+ def set_gain(self, band: int, gain: float):
+ if band < 0 or band >= self._band_count:
+ raise IndexError(f"Band {band} does not exist!")
+
+ gain = min(max(gain, -0.25), 1.0)
+
+ self.bands[band] = gain
+
+ def get_gain(self, band: int):
+ if band < 0 or band >= self._band_count:
+ raise IndexError(f"Band {band} does not exist!")
+ return self.bands[band]
+
+ def visualise(self):
+ block = ""
+ bands = [str(band + 1).zfill(2) for band in range(self._band_count)]
+ bottom = (" " * 8) + " ".join(bands)
+ gains = [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, -0.1, -0.2, -0.25]
+
+ for gain in gains:
+ prefix = ""
+ if gain > 0:
+ prefix = "+"
+ elif gain == 0:
+ prefix = " "
+
+ block += f"{prefix}{gain:.2f} | "
+
+ for value in self.bands:
+ if value >= gain:
+ block += "[] "
+ else:
+ block += " "
+
+ block += "\n"
+
+ block += bottom
+ return block
diff --git a/redbot/cogs/audio/errors.py b/redbot/cogs/audio/errors.py
new file mode 100644
index 000000000..6fa72bb96
--- /dev/null
+++ b/redbot/cogs/audio/errors.py
@@ -0,0 +1,97 @@
+import aiohttp
+
+
+class AudioError(Exception):
+ """Base exception for errors in the Audio cog."""
+
+
+class LavalinkDownloadFailed(AudioError, RuntimeError):
+ """Downloading the Lavalink jar failed.
+
+ Attributes
+ ----------
+ response : aiohttp.ClientResponse
+ The response from the server to the failed GET request.
+ should_retry : bool
+ Whether or not the Audio cog should retry downloading the jar.
+
+ """
+
+ def __init__(self, *args, response: aiohttp.ClientResponse, should_retry: bool = False):
+ super().__init__(*args)
+ self.response = response
+ self.should_retry = should_retry
+
+ def __repr__(self) -> str:
+ str_args = [*map(str, self.args), self._response_repr()]
+ return f"LavalinkDownloadFailed({', '.join(str_args)}"
+
+ def __str__(self) -> str:
+ return f"{super().__str__()} {self._response_repr()}"
+
+ def _response_repr(self) -> str:
+ return f"[{self.response.status} {self.response.reason}]"
+
+
+class PlayListError(AudioError):
+ """Base exception for errors related to playlists."""
+
+
+class InvalidPlaylistScope(PlayListError):
+ """Provided playlist scope is not valid."""
+
+
+class MissingGuild(PlayListError):
+ """Trying to access the Guild scope without a guild."""
+
+
+class MissingAuthor(PlayListError):
+ """Trying to access the User scope without an user id."""
+
+
+class TooManyMatches(PlayListError):
+ """Too many playlist match user input."""
+
+
+class NotAllowed(PlayListError):
+ """Too many playlist match user input."""
+
+
+class ApiError(AudioError):
+ """Base exception for API errors in the Audio cog."""
+
+
+class SpotifyApiError(ApiError):
+ """Base exception for Spotify API errors."""
+
+
+class SpotifyFetchError(SpotifyApiError):
+ """Fetching Spotify data failed."""
+
+ def __init__(self, message, *args):
+ self.message = message
+ super().__init__(*args)
+
+
+class YouTubeApiError(ApiError):
+ """Base exception for YouTube Data API errors."""
+
+
+class DatabaseError(AudioError):
+ """Base exception for database errors in the Audio cog."""
+
+
+class InvalidTableError(DatabaseError):
+ """Provided table to query is not a valid table."""
+
+
+class LocalTrackError(AudioError):
+ """Base exception for local track errors."""
+
+
+class InvalidLocalTrack(LocalTrackError):
+ """Base exception for local track errors."""
+
+
+class InvalidLocalTrackFolder(LocalTrackError):
+ """Base exception for local track errors."""
diff --git a/redbot/cogs/audio/locales/ar-SA.po b/redbot/cogs/audio/locales/ar-SA.po
index 4e7147f7a..e119eca0d 100644
--- a/redbot/cogs/audio/locales/ar-SA.po
+++ b/redbot/cogs/audio/locales/ar-SA.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: ar_SA\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/bg-BG.po b/redbot/cogs/audio/locales/bg-BG.po
index 49685e1e0..d33dbb82b 100644
--- a/redbot/cogs/audio/locales/bg-BG.po
+++ b/redbot/cogs/audio/locales/bg-BG.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Bulgarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: bg_BG\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/cs-CZ.po b/redbot/cogs/audio/locales/cs-CZ.po
new file mode 100644
index 000000000..6d1a3303b
--- /dev/null
+++ b/redbot/cogs/audio/locales/cs-CZ.po
@@ -0,0 +1,1290 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: red-discordbot\n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: redgettext 3.0\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
+"X-Generator: crowdin.com\n"
+"X-Crowdin-Project: red-discordbot\n"
+"X-Crowdin-Language: cs\n"
+"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
+"Language: cs_CZ\n"
+
+#: redbot/cogs/audio/audio.py:47
+#, docstring
+msgid "Play audio through voice channels."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:260
+msgid "music in {} servers"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
+msgid "Queue ended."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:350
+msgid "Track Error"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:355
+msgid "Skipping..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:363
+#, docstring
+msgid "Music configuration options."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:369
+#, docstring
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
+msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:400
+msgid "Response timed out, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
+#, docstring
+msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
+msgid "Can't be less than zero."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:418
+msgid "Empty disconnect disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:423
+msgid "Empty disconnect timer set to {num_seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:434
+#, docstring
+msgid "Set a price for queueing tracks for non-mods. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:439
+msgid "Jukebox mode disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:444
+msgid "Track queueing command price set to {price} {currency}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
+#, docstring
+msgid "Toggle track announcement and other bot messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:563
+msgid "Verbose mode on: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
+#, docstring
+msgid "Show the current settings."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:604
+msgid "Server Settings"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
+#, docstring
+msgid "Instructions to set the Spotify API tokens."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:665
+#, docstring
+msgid "Enable/disable tracks' titles as status."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:669
+msgid "Song titles as status: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
+#, docstring
+msgid "Audio stats."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
+msgid "Nothing playing."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:758
+msgid "Not connected anywhere."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:779
+#, docstring
+msgid "Bump a track number to the top of the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:788
+msgid "You must be in the voice channel to bump a track."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:792
+msgid "You need the DJ role to bump tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
+msgid "Song number must be greater than 1 and within the queue limit."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:810
+msgid "Moved {track} to the top of the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:817
+#, docstring
+msgid "Disconnect from the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:826
+msgid "You need the DJ role to disconnect."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:830
+msgid "There are other people listening to music."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
+#, docstring
+msgid "Local playback commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1104
+#, docstring
+msgid "Play all songs in a localtracks folder."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
+#, docstring
+msgid "Play a local track."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1126
+msgid "No local track folders found."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1169
+#, docstring
+msgid "Search for songs across all localtracks folders."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1174
+msgid "No album folders found."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
+msgid "No matches."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1269
+msgid "No localtracks folder."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1278
+#, docstring
+msgid "Now playing."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1298
+msgid "Requested by: **{track.requester}**"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1308
+msgid "Nothing."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1368
+#, docstring
+msgid "Pause or resume a playing track."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1401
+msgid "Track Paused"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1407
+msgid "Track Resumed"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1417
+#, docstring
+msgid "Queue percentage."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1443
+msgid "Nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1465
+msgid "Queued and playing tracks:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1474
+#, docstring
+msgid "Play a URL or search for a track."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
+msgid "I don't have permission to connect to your channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
+msgid "Connect to a voice channel first."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
+msgid "Connection to Lavalink has not yet been established."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1508
+msgid "You need the DJ role to queue tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1519
+msgid "You must be in the voice channel to use the play command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1525
+msgid "No tracks to play."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
+msgid "Nothing found."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
+msgid "Playlist Enqueued"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1695
+msgid "{time} until start of playlist playback: starts at #{position} in queue"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
+msgid "Track Enqueued"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
+msgid "{time} until track playback: #{position} in queue"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
+msgid "#{position} in queue"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
+#, docstring
+msgid "Playlist configuration options."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1876
+#, docstring
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
+msgid "You are not the author of that playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1898
+msgid "{track} is already in {playlist}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
+msgid "No playlist with that name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1914
+msgid "{track} appended to {playlist}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1920
+msgid "{num} tracks appended to {playlist}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
+#, docstring
+msgid "Create an empty playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
+msgid "You need the DJ role to save playlists."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
+msgid "Playlist name already exists, try again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2017
+msgid "Empty playlist {name} created."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2021
+#, docstring
+msgid "Delete a saved playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2033
+msgid "{name} playlist deleted."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
+#, docstring
+msgid "Retrieve information from a saved playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2126
+#, docstring
+msgid "List saved playlists."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2129
+msgid "No saved playlists."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2141
+msgid "Tracks: {num}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2166
+msgid "Playlists for {server_name}:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2170
+msgid "Page {page_num}/{total_pages} | {num} playlists"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2179
+#, docstring
+msgid "Save the queue to a playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
+msgid "Please enter a name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2227
+msgid "Playlist {name} saved from current queue: {num} tracks added."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2234
+#, docstring
+msgid "Remove a track from a playlist by url."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2248
+msgid "URL not in playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2252
+msgid "No tracks left, removing playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2259
+msgid "{num} entries have been removed from the {playlist_name} playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2266
+msgid "The track has been removed from the {playlist_name} playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2273
+#, docstring
+msgid "Save a playlist from a url."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2285
+msgid "Playlist {name} saved: {num} tracks added."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2292
+#, docstring
+msgid "Load a playlist into the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2336
+#, docstring
+msgid "Convert a Red v2 playlist file to a playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2342
+msgid "Please upload the playlist file. Any other message will cancel this operation."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2350
+msgid "No file detected, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2354
+msgid "Upload cancelled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2358
+msgid "Only playlist files can be uploaded."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2363
+msgid "Not a valid playlist file."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2379
+msgid "A playlist already exists with this name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2407
+msgid "No tracks found."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2413
+msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2418
+msgid "Added {num} tracks from the {playlist_name} playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2422
+msgid "Playlist Saved"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2433
+msgid "You need the DJ role to use playlists."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2471
+msgid "You must be in the voice channel to use the playlist command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2525
+#, docstring
+msgid "Skip to the start of the previously played track."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
+msgid "You need the DJ role to skip tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
+msgid "You must be in the voice channel to skip the music."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2543
+msgid "Turn shuffle off to use this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2545
+msgid "No previous track."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2562
+msgid "Replaying Track"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2571
+#, docstring
+msgid "List the songs in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2622
+msgid "**Currently livestreaming:**"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
+msgid "Playing: "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
+msgid "Requested by: **{user}**"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
+msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2693
+msgid "Repeat"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2695
+msgid "Shuffle"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2740
+msgid "Matching Tracks:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
+msgid "Page {page_num}/{total_pages}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
+#, docstring
+msgid "Toggle repeat."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2835
+msgid "You need the DJ role to toggle repeat."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2843
+msgid "You must be in the voice channel to toggle repeat."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2849
+msgid "Repeat tracks: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2857
+#, docstring
+msgid "Remove a specific track number from the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2863
+msgid "Nothing queued."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2866
+msgid "You need the DJ role to remove tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2871
+msgid "You must be in the voice channel to manage the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2887
+msgid "Removed {track} from the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2894
+#, docstring
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2958
+msgid "You must be in the voice channel to enqueue tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3003
+msgid "{time} until start of search playback: starts at #{position} in queue"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3169
+msgid "Tracks Found:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3170
+msgid "search results"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3173
+msgid "Folders Found:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3174
+msgid "local folders"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3176
+msgid "Files Found:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3177
+msgid "local tracks"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3195
+#, docstring
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3206
+msgid "You must be in the voice channel to use seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3211
+msgid "You need the DJ role to use seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
+msgid "There are other people listening - vote to skip instead."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3221
+msgid "Can't seek on a stream."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
+msgid "Moved {num_seconds}s to 00:00:00"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3241
+msgid "Moved {num_seconds}s to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
+#, docstring
+msgid "Toggle shuffle."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3265
+msgid "You need the DJ role to toggle shuffle."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3273
+msgid "You must be in the voice channel to toggle shuffle."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3279
+msgid "Shuffle tracks: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3287
+#, docstring
+msgid "Make Red sing one of her songs."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3303
+#, docstring
+msgid "Skip to the next track, or to a given track number."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
+msgid "I removed your vote to skip."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3329
+msgid "You voted to skip."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3342
+msgid "Vote threshold met."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3345
+msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3425
+msgid "Currently livestreaming {track}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3432
+msgid "{time} left on {track}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
+msgid "Track Skipped"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3493
+#, docstring
+msgid "Stop playback and clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3503
+msgid "You must be in the voice channel to stop the music."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3514
+msgid "You need the DJ role to stop the music."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3516
+msgid "Stopping..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
+#, docstring
+msgid "Set the volume, 1% - 150%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3571
+msgid "Current Volume:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3583
+msgid "You must be in the voice channel to change the volume."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3589
+msgid "You need the DJ role to change the volume."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3602
+msgid "Volume:"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3613
+#, docstring
+msgid "Lavalink server configuration options."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3618
+#, docstring
+msgid "Toggle using external lavalink servers."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
+msgid "External lavalink server: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3642
+#, docstring
+msgid "Set the lavalink server host."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
+msgid "Host set to {host}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
+msgid "External lavalink server set to True."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3657
+#, docstring
+msgid "Set the lavalink server password."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
+msgid "Server password set to {password}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3675
+#, docstring
+msgid "Set the lavalink REST server port."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
+msgid "REST port set to {port}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3691
+#, docstring
+msgid "Set the lavalink websocket server port."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
+msgid "Websocket port set to {port}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3801
+msgid "Not enough {currency} ({required_credits} required)."
+msgstr ""
+
diff --git a/redbot/cogs/audio/locales/da-DK.po b/redbot/cogs/audio/locales/da-DK.po
index 065069bd9..fa716bc74 100644
--- a/redbot/cogs/audio/locales/da-DK.po
+++ b/redbot/cogs/audio/locales/da-DK.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Danish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: da_DK\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/de-DE.po b/redbot/cogs/audio/locales/de-DE.po
index a8073dc55..940139d7a 100644
--- a/redbot/cogs/audio/locales/de-DE.po
+++ b/redbot/cogs/audio/locales/de-DE.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,979 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: de_DE\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr "Spiele Audio über Sprachkanäle ab."
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr "Jetzt läuft"
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr "Länge des Tracks: {length} | Angefordert von: {user}"
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr "Musik in {} Servern"
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr "Jetzt läuft"
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr "Länge des Tracks: {length} | Angefordert von: {user}"
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr "Warteschlange beendet."
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr "Track-Fehler"
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr "Überspringe..."
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr "Musik Konfigurationsoptionen."
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
-msgstr "Schalte DJ Mode um.\n\n"
-" DJ Mode erlaubt Benutzern mit der DJ Rolle die Audio Befehle zu nutzen. "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
+msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr "Automatischer Disconnect beim Playlistende: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr "Bitte wähle eine Rolle für den DJ Mode. Gib den Rollen Namen oder die ID jetzt ein."
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr "Zeitüberschreitung der Antwort, versuch es später erneut."
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr "DJ Rolle aktiviert: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr "Auto-Disconnect nach x Sekunden wenn gestoppt. 0 zum deaktivieren."
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr "Kann nicht weniger als Null sein."
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
-msgstr "Leerer Kanal Disconnect deaktiviert."
+msgstr "Trennung bei leerem Kanal deaktiviert."
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr "Leerer Kanal Disconnect Timer gesetzt auf {num_seconds}."
-#: redbot/cogs/audio/audio.py:307
+#: redbot/cogs/audio/audio.py:434
+#, docstring
+msgid "Set a price for queueing tracks for non-mods. 0 to disable."
+msgstr "Lege einen Preis für Nicht-Mods fest, um Lieder einzureihen. 0 zum Deaktivieren."
+
+#: redbot/cogs/audio/audio.py:439
+msgid "Jukebox mode disabled."
+msgstr "Jukebox Modus deaktiviert."
+
+#: redbot/cogs/audio/audio.py:444
+msgid "Track queueing command price set to {price} {currency}."
+msgstr "Der Preis für das Hinzufügen eines Titels in die Warteschlange wurde auf {price} {currency} gesetzt."
+
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr "Der Pfad für Lokale Musik wurde zu dem standart Pfad zurückgesetzt."
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr "{local_path} sieht nicht wie ein gültiges Verzeichnis aus."
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr "Das angegebene Verzeichnis besitzt keine {filelist}, Das Verzeichnis wird gespeichert, aber bitte Kontrollieren das Verzeichnis bevor du versuchst lokale Lieder abzuspielen oder deine Lavalink.jar zu starten."
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr "Lokaler Pfad gesetzt zu: {local_path}."
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr "Maximale Track länge deaktiviert."
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr "Maximale Track länge gesetzt zu: {seconds}."
+
+#: redbot/cogs/audio/audio.py:559
+#, docstring
+msgid "Toggle track announcement and other bot messages."
+msgstr "Titel-Ankündigung und andere Bot-Nachrichten umschalten."
+
+#: redbot/cogs/audio/audio.py:563
+msgid "Verbose mode on: {true_or_false}."
+msgstr "Ausführlicher Modus eingeschaltet: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr "Kommerzielle Links nur: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:582
#, docstring
msgid "Set the role to use for DJ mode."
msgstr "Wähle die Rolle die für den DJ Mode genutzt wird."
-#: redbot/cogs/audio/audio.py:310
+#: redbot/cogs/audio/audio.py:585
msgid "DJ role set to: {role.name}."
msgstr "DJ Rolle gesetzt auf: {role.name}."
-#: redbot/cogs/audio/audio.py:315
-#, docstring
-msgid "Set a price for queueing tracks for non-mods. 0 to disable."
-msgstr "Setze einen Preis um Lieder einzureihen für Nicht-Mods. 0 zum deaktivieren."
-
-#: redbot/cogs/audio/audio.py:320
-msgid "Jukebox mode disabled."
-msgstr "Jukebox Modus deaktiviert."
-
-#: redbot/cogs/audio/audio.py:325
-msgid "Track queueing command price set to {price} {currency}."
-msgstr "Der Preis für das Hinzufügen eines Tracks in die Warteschlange wurde auf {price} {currency} gesetzt."
-
-#: redbot/cogs/audio/audio.py:336
-#, docstring
-msgid "Toggle track announcement and other bot messages."
-msgstr "Track-Ankündigung und andere Bot-Nachrichten umschalten."
-
-#: redbot/cogs/audio/audio.py:340
-msgid "Verbose mode on: {true_or_false}."
-msgstr "Ausführlichen Modus auf: {true_or_false}."
-
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
-msgstr "Zeige aktuelle Einstellungen an"
+msgstr "Zeige die aktuellen Einstellungen an."
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr "Server Einstellungen"
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
-msgstr "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
-msgstr "DJ Rolle: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
-msgstr "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
-msgstr "Befehlspreis: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
-msgstr "Wiederholung: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song benachrichtigen Msgs: [{notify}]\n"
-"Songs als Status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
-msgstr "Miniaturansichten: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
-msgstr "Abstimmung überspringen: [{vote_enabled}]\n"
-"Skip Prozentsatz: [%{vote_percent}]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
-msgstr "---Lavalink Einstellungen---\n"
-"Cog Version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"Externer Server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
-msgstr "Zeigt ein Vorschaubild auf Audionachrichten an."
+msgid "Instructions to set the Spotify API tokens."
+msgstr "Anleitung um die Spotify API tokens einzurichten."
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
-msgstr "Miniaturansicht: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
+msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr "Prozentsatz benötigt für Nicht-Mods, um Tracks zu überspringen. 0 um zu deaktivieren."
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr "Voting deaktiviert. Alle Benutzer können Queue Management Befehle verwenden."
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr "Stimmen-Anteil auf {percent} % festgelegt."
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
-msgstr "Aktivieren/Deaktivieren Track-Titel als Status."
+msgstr "Aktiviert/Deaktiviert Titel als Status."
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr "Titel als Status: {true_or_false}."
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr "Zeige Miniaturbilder bei Audio-Mitteilungen an."
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr "Miniaturansicht: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr "Benötigte Stimmen in Prozent für Nicht-Mods, um Titel zu überspringen. 0 um zum Deaktivieren."
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr "Abstimmung deaktiviert. Alle Benutzer können Warteschlangen Management Befehle verwenden."
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr "Stimmen-Anteil auf {percent} % festgelegt."
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr "Anleitung um den YouTube API key einzurichten."
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr "Audio-Statistiken."
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
-msgstr "Nichts spielt."
+msgstr "Keine Wiedergabe."
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
-msgstr "Nicht überall verbunden."
+msgstr "Keine Verbindungen."
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
-msgstr "Verbunden in {num} Server:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
+msgstr "Spielt in {num}/{total} Serverm:"
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr "Befördert einen Track mit einer bestimmten Nummer an die Spitze der Warteschlange."
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
-msgstr "Du musst dich in dem Sprackkanal des Bot's befinden, um die Reihenfolge der Warteschlange zu verändern."
+msgstr "Du musst dich in dem Sprachkanal befinden, um einen Titel an den Anfang der Warteschlange zu schieben."
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
-msgstr "Du benötigst die DJ-Rolle, um die Warteschlange zu verändern."
+msgstr "Du benötigst die DJ Rolle, um Titel an den Anfang zu schieben."
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr "Die Track Nummer muss zwischen 1 und der Anzahl an Tracks in der Warteschlange liegen."
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr "{track} wurde an die Spitze der Warteschlange gesetzt."
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
-msgstr "Verlasse den Sprachkanal."
+msgstr "Verbindung zum Sprachkanal trennen."
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
-msgstr "Du benötigst die DJ-Rolle, um die Verbindung zu trennen."
+msgstr "Du benötigst die DJ Rolle, um die Verbindung zu trennen."
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr "Es gerade andere Leute, die Musik hören."
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr "Bitte den Befehl mit einem kürzeren Namen erneut versuchen."
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr "Befehle zur lokalen Wiedergabe."
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr "Spielt alle Tracks ab, welche sich in einem Lokalen Ordner befinden."
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr "Kein Lokaler Musikordner mit dem Namen {name}."
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr "Spielt einen Lokalen Track ab."
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr "Es wurde kein lokaler Track-Ordner gefunden."
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr "Sucht nach Tracks in allen lokalen Ordnern."
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
-msgstr "Es wurde kein Album-Ordner gefunden."
+msgstr "Keine Album-Ordner gefunden."
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
-msgstr "Keine Übereinstimmungen."
+msgstr "Keine Treffer."
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr "Es existiert kein Lokaler Track-Ordner."
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr "Aktuelle Wiedergabe."
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr "Hinzugefügt von: **{track.requester}**"
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr "Nichts."
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
-msgstr "Wiedergabe anhalten, zum fortsetzen `[p]resume`."
+msgid "Pause or resume a playing track."
+msgstr "Pausiere oder setze ein spielendes Lied fort."
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
-msgstr "Du musst dich in dem Sprackkanal des Bot's befinden, um die Wiedergabe zu pausieren."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
+msgstr "Du musst im Voice Channel sein um zu pausieren oder fortzusetzen."
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
-msgstr "Du benötigst die DJ-Rolle, um die Wiedergabe zu pausieren."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
+msgstr "Du brachst die DJ Rolle um zu pausieren oder um fortzusetzen."
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
-msgstr "Track angehalten."
+msgstr "Titel pausiert"
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
-msgstr "Track wird fortgesetzt."
+msgstr "Titel wird fortgesetzt"
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr "Track ist pausiert."
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr "Track wird wiedergegeben."
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
-msgstr "Anteile in Warteschlange (in Prozent)."
+msgstr "Position in Warteschlange (in Prozent)."
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr "Die Warteschlange ist leer."
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
-msgstr ""
+msgstr "Eingereihte und spielende Titel:"
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
+msgstr "Spiele eine URL ab oder suche nach einem Titel."
+
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr "Dieser Link ist nicht erlaubt."
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
-msgstr ""
+msgstr "Ich habe keine Berechtigung, um mich zu deinem Kanal zu verbinden."
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
-msgstr ""
+msgstr "Verbinde dich zuerst mit einem Sprachkanal."
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
-msgstr ""
+msgstr "Verbindung zu Lavalink wurde noch nicht hergestellt."
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
-msgstr ""
+msgstr "Du benötigst die DJ Rolle um Titel einzureihen."
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
-msgstr ""
+msgstr "Du musst dich in dem Sprachkanal befinden, um den play Befehl zu verwenden."
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
+msgstr "Keine Titel zum Abspielen."
+
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr "Warte bis die Playlist fertig geladen hat."
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
+msgstr "Nichts gefunden."
+
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr "Das sieht nicht nach einem gültigen Spotify Code oder einer gültigen URL aus."
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
-msgstr ""
+msgstr "Wiedergabeliste eingereiht"
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:958
-msgid "{time} until start of playlist playback: starts at #{position} in queue"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
-msgid "Track Enqueued"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
-msgid "{time} until track playback: #{position} in queue"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
-msgid "#{position} in queue"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:997
-#, docstring
-msgid "Playlist configuration options."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1002
-#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
-msgid "You are not the author of that playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1024
-msgid "{track} is already in {playlist}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
-msgid "No playlist with that name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1040
-msgid "{track} appended to {playlist}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1046
-msgid "{num} tracks appended to {playlist}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1053
-#, docstring
-msgid "Create an empty playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
-msgid "You need the DJ role to save playlists."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
-msgid "Playlist name already exists, try again with a different name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1067
-msgid "Empty playlist {name} created."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1071
-#, docstring
-msgid "Delete a saved playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1083
-msgid "{name} playlist deleted."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1087
-#, docstring
-msgid "Retrieve information from a saved playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
-#, docstring
-msgid "List saved playlists."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1118
-msgid "No saved playlists."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1130
-msgid "Tracks: {num}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1155
-msgid "Playlists for {server_name}:"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1159
-msgid "Page {page_num}/{total_pages} | {num} playlists"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1168
-#, docstring
-msgid "Save the queue to a playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1189
-msgid "Please enter a name for this playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
-msgid "Playlist {name} saved from current queue: {num} tracks added."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1221
-#, docstring
-msgid "Remove a track from a playlist by url."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1235
-msgid "URL not in playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1239
-msgid "No tracks left, removing playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1246
-msgid "{num} entries have been removed from the {playlist_name} playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1253
-msgid "The track has been removed from the {playlist_name} playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1260
-#, docstring
-msgid "Save a playlist from a url."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1272
-msgid "Playlist {name} saved: {num} tracks added."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1279
-#, docstring
-msgid "Load a playlist into the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
-#, docstring
-msgid "Convert a Red v2 playlist file to a playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1315
-msgid "Please upload the playlist file. Any other message will cancel this operation."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1323
-msgid "No file detected, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1327
-msgid "Upload cancelled."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1331
-msgid "Only playlist files can be uploaded."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1336
-msgid "Not a valid playlist file."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1352
-msgid "A playlist already exists with this name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
-msgid "No tracks found."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1383
-msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1388
-msgid "Added {num} tracks from the {playlist_name} playlist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1392
-msgid "Playlist Saved"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1403
-msgid "You need the DJ role to use playlists."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1432
-msgid "You must be in the voice channel to use the playlist command."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1464
-#, docstring
-msgid "Skip to the start of the previously played track."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
-msgid "You need the DJ role to skip tracks."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
-msgid "You must be in the voice channel to skip the music."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1482
-msgid "Turn shuffle off to use this command."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1484
-msgid "No previous track."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1501
-msgid "Replaying Track"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1509
-#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
-msgid "**Currently livestreaming:**"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
-msgid "Playing: "
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1577
-msgid "Requested by: **{user}**"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1615
-msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1624
-msgid "Repeat"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1626
-msgid "Shuffle"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1683
-msgid "Matching Tracks:"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
-msgid "Page {page_num}/{total_pages}"
-msgstr ""
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
+msgstr "Es wurden {num} Tracks zu der Playlist hinzugefügt.{maxlength_msg}"
#: redbot/cogs/audio/audio.py:1695
+msgid "{time} until start of playlist playback: starts at #{position} in queue"
+msgstr "{time} bis zum Start der Wiedergabeliste: beginnt bei #{position} in der Warteschlange"
+
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr "Der Track überschreitet die maximale Länge."
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr "Nichts Gefunden. Kontrolliere deine Lavalink logs für Details."
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
+msgid "Track Enqueued"
+msgstr "Titel eingereiht"
+
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
+msgid "{time} until track playback: #{position} in queue"
+msgstr "{time} bis zur Wiedergabe des Titels: #{position} in der Warteschlange"
+
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
+msgid "#{position} in queue"
+msgstr "#{position} in der Warteschlange"
+
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr "Bitte warten, füge Titel hinzu..."
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr "Die Verbindung wurde zurückgesetzt beim Laden der Playlist."
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr "Lade Titel {num}/{total}..."
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr "Ungefähre Zeit verbleibend: {seconds}"
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
-msgid "Toggle repeat."
-msgstr ""
+msgid "Playlist configuration options."
+msgstr "Einstellungen der Wiedergabeliste-Optionen."
-#: redbot/cogs/audio/audio.py:1701
-msgid "You need the DJ role to toggle repeat."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1712
-msgid "You must be in the voice channel to toggle repeat."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1715
-msgid "Repeat tracks: {true_or_false}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Remove a specific track number from the queue."
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
-msgid "Nothing queued."
-msgstr ""
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
+msgid "You are not the author of that playlist."
+msgstr "Du bist nicht der Ersteller dieser Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:1730
-msgid "You need the DJ role to remove tracks."
-msgstr ""
+#: redbot/cogs/audio/audio.py:1898
+msgid "{track} is already in {playlist}."
+msgstr "{track} ist bereits in {playlist}."
-#: redbot/cogs/audio/audio.py:1735
-msgid "You must be in the voice channel to manage the queue."
-msgstr ""
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
+msgid "No playlist with that name."
+msgstr "Es gibt keine Wiedergabeliste mit diesem Namen."
-#: redbot/cogs/audio/audio.py:1751
-msgid "Removed {track} from the queue."
-msgstr ""
+#: redbot/cogs/audio/audio.py:1914
+msgid "{track} appended to {playlist}."
+msgstr "{track} angehängt an {playlist}."
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:1920
+msgid "{num} tracks appended to {playlist}."
+msgstr "{num} Titel an {playlist} angehangen."
+
+#: redbot/cogs/audio/audio.py:1928
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Copy a playlist from one server to another."
+msgstr "Kopiere eine Playlist von einem Server zum anderen."
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr "Ungültige Server ID vom Quell Server."
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr "Ungültige Server ID für den Ziel Server."
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr "Keine Playlist mit dem Namen gefunden in {from_guild_name}."
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr "Playlist {name} kopiert von {from_guild_name} zu {to_guild_name}."
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
-msgid "You must be in the voice channel to enqueue tracks."
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr "Versuche den Playlist kopier Befehl erneut mit einem kürzeren Namen."
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr "Playlist Name existiert bereits in {to_guild_name}, versuche den Befehl erneut mit einem anderen Namen."
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr "Kein Name der Wiedergabeliste angegeben, versuche es später erneut."
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1837
-msgid "{time} until start of search playback: starts at #{position} in queue"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1997
-msgid "Tracks Found:"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1998
-msgid "search results"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2001
-msgid "Folders Found:"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2002
-msgid "local folders"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2004
-msgid "Files Found:"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2005
-msgid "local tracks"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:2003
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
-msgstr ""
+msgid "Create an empty playlist."
+msgstr "Erstelle eine leere Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:2031
-msgid "You must be in the voice channel to use seek."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
+msgid "You need the DJ role to save playlists."
+msgstr "Du benötigst die DJ Rolle, um Wiedergabelisten zu speichern."
-#: redbot/cogs/audio/audio.py:2036
-msgid "You need the DJ role to use seek."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
+msgid "Playlist name already exists, try again with a different name."
+msgstr "Wiedergabeliste mit diesem Namen existiert bereits, versuche es erneut mit einem anderen Namen."
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
-msgid "There are other people listening - vote to skip instead."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2017
+msgid "Empty playlist {name} created."
+msgstr "Leere Wiedergabeliste {name} erstellt."
-#: redbot/cogs/audio/audio.py:2046
-msgid "Can't seek on a stream."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2052
-msgid "Moved {num_seconds}s to 00:00:00"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2057
-msgid "Moved {num_seconds}s to {time}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:2021
#, docstring
-msgid "Toggle shuffle."
-msgstr ""
+msgid "Delete a saved playlist."
+msgstr "Lösche eine gespeicherte Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:2072
-msgid "You need the DJ role to toggle shuffle."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2033
+msgid "{name} playlist deleted."
+msgstr "{name} Wiedergabeliste gelöscht."
-#: redbot/cogs/audio/audio.py:2083
-msgid "You must be in the voice channel to toggle shuffle."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2086
-msgid "Shuffle tracks: {true_or_false}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:2039
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr "Die Playlist hat keine Lieder."
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr "Diese Wiedergabeliste existiert nicht."
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
-msgid "Skip to the next track."
+msgid "Retrieve information from a saved playlist."
+msgstr "Informationen aus einer gespeicherten Wiedergabeliste abrufen."
+
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
+msgstr "Autor: {author_name} | {num} Lied(er)"
+
#: redbot/cogs/audio/audio.py:2126
-msgid "I removed your vote to skip."
-msgstr ""
+#, docstring
+msgid "List saved playlists."
+msgstr "Liste gespeicherte Wiedergabelisten auf."
#: redbot/cogs/audio/audio.py:2129
-msgid "You voted to skip."
-msgstr ""
+msgid "No saved playlists."
+msgstr "Keine gespeicherten Wiedergabelisten."
+
+#: redbot/cogs/audio/audio.py:2141
+msgid "Tracks: {num}"
+msgstr "Titel: {num}"
#: redbot/cogs/audio/audio.py:2142
-msgid "Vote threshold met."
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
-msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
-msgstr ""
+#: redbot/cogs/audio/audio.py:2166
+msgid "Playlists for {server_name}:"
+msgstr "Wiedergabelisten für {server_name}:"
-#: redbot/cogs/audio/audio.py:2228
-msgid "Currently livestreaming {track}"
-msgstr ""
+#: redbot/cogs/audio/audio.py:2170
+msgid "Page {page_num}/{total_pages} | {num} playlists"
+msgstr "Seite {page_num}/{total_pages} | {num} Wiedergabelisten"
-#: redbot/cogs/audio/audio.py:2235
-msgid "{time} left on {track}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2253
-msgid "Track Skipped"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:2179
#, docstring
-msgid "Stop playback and clear the queue."
-msgstr ""
+msgid "Save the queue to a playlist."
+msgstr "Speichert die Warteschlange als eine Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:2271
-msgid "You must be in the voice channel to stop the music."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr "Die Warteschlange ist leer."
-#: redbot/cogs/audio/audio.py:2282
-msgid "You need the DJ role to stop the music."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2202
+msgid "Please enter a name for this playlist."
+msgstr "Bitte einen Namen für die Wiedergabeliste eingeben."
-#: redbot/cogs/audio/audio.py:2284
-msgid "Stopping..."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2227
+msgid "Playlist {name} saved from current queue: {num} tracks added."
+msgstr "Wiedergabeliste {name} aus aktueller Warteschlange gespeichert: {num} Titel hinzugefügt."
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:2234
#, docstring
-msgid "Set the volume, 1% - 150%."
-msgstr ""
+msgid "Remove a track from a playlist by url."
+msgstr "Entferne einen Titel von einer Wiedergabeliste anhand einer URL."
-#: redbot/cogs/audio/audio.py:2300
-msgid "Current Volume:"
-msgstr ""
+#: redbot/cogs/audio/audio.py:2248
+msgid "URL not in playlist."
+msgstr "URL ist nicht in der Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:2312
-msgid "You must be in the voice channel to change the volume."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2252
+msgid "No tracks left, removing playlist."
+msgstr "Keine Titel mehr übrig, entferne Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:2318
-msgid "You need the DJ role to change the volume."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2259
+msgid "{num} entries have been removed from the {playlist_name} playlist."
+msgstr "{num} Einträge wurden aus der Wiedergabeliste {playlist_name} entfernt."
-#: redbot/cogs/audio/audio.py:2331
-msgid "Volume:"
-msgstr ""
+#: redbot/cogs/audio/audio.py:2266
+msgid "The track has been removed from the {playlist_name} playlist."
+msgstr "Der Titel wurde aus der Wiedergabeliste {playlist_name} entfernt."
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:2273
#, docstring
-msgid "Lavalink server configuration options."
-msgstr ""
+msgid "Save a playlist from a url."
+msgstr "Wiedergabeliste aus einer URL erstellen."
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:2285
+msgid "Playlist {name} saved: {num} tracks added."
+msgstr "Wiedergabeliste {name} gespeichert: {num} Titel hinzugefügt."
+
+#: redbot/cogs/audio/audio.py:2292
#, docstring
-msgid "Toggle using external lavalink servers."
-msgstr ""
+msgid "Load a playlist into the queue."
+msgstr "Lade eine Wiedergabeliste in die Warteschlange."
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
-msgid "External lavalink server: {true_or_false}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:2336
#, docstring
-msgid "Set the lavalink server host."
-msgstr ""
+msgid "Convert a Red v2 playlist file to a playlist."
+msgstr "Konvertiere eine Red v2 Wiedergabeliste Datei zu einer Wiedergabeliste."
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
-msgid "Host set to {host}."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2342
+msgid "Please upload the playlist file. Any other message will cancel this operation."
+msgstr "Bitte lade die Wiedergabeliste Datei hoch. Weitere Nachrichten werden diesen Vorgang abbrechen."
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
-msgid "External lavalink server set to True."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2350
+msgid "No file detected, try again later."
+msgstr "Keine Datei erkannt, versuche es später erneut."
-#: redbot/cogs/audio/audio.py:2388
-#, docstring
-msgid "Set the lavalink server password."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2354
+msgid "Upload cancelled."
+msgstr "Upload abgebrochen."
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
-msgid "Server password set to {password}."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2358
+msgid "Only playlist files can be uploaded."
+msgstr "Nur Wiedergabeliste Dateien können hochgeladen werden."
-#: redbot/cogs/audio/audio.py:2406
-#, docstring
-msgid "Set the lavalink REST server port."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2363
+msgid "Not a valid playlist file."
+msgstr "Keine gültige Wiedergabeliste Datei."
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
-msgid "REST port set to {port}."
-msgstr ""
+#: redbot/cogs/audio/audio.py:2379
+msgid "A playlist already exists with this name."
+msgstr "Eine Wiedergabeliste mit diesem Namen existiert bereits."
+
+#: redbot/cogs/audio/audio.py:2407
+msgid "No tracks found."
+msgstr "Keine Titel gefunden."
+
+#: redbot/cogs/audio/audio.py:2413
+msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
+msgstr "{num} Titel aus der {playlist_name} Wiedergabeliste hinzugefügt. {num_bad} Titel konnten nicht geladen werden."
+
+#: redbot/cogs/audio/audio.py:2418
+msgid "Added {num} tracks from the {playlist_name} playlist."
+msgstr "{num} Titel aus der {playlist_name} Wiedergabeliste hinzugefügt."
#: redbot/cogs/audio/audio.py:2422
+msgid "Playlist Saved"
+msgstr "Wiedergabeliste gespeichert"
+
+#: redbot/cogs/audio/audio.py:2433
+msgid "You need the DJ role to use playlists."
+msgstr "Du benötigst die DJ Rolle, um Wiedergabelisten zu verwenden."
+
+#: redbot/cogs/audio/audio.py:2471
+msgid "You must be in the voice channel to use the playlist command."
+msgstr "Du musst dich in dem Sprachkanal befinden, um den Wiedergabelisten Befehl zu verwenden."
+
+#: redbot/cogs/audio/audio.py:2525
+#, docstring
+msgid "Skip to the start of the previously played track."
+msgstr "Zum Anfang des zuvor abgespielten Titels springen."
+
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
+msgid "You need the DJ role to skip tracks."
+msgstr "Du benötigst die DJ Rolle um Titel zu überspringen."
+
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
+msgid "You must be in the voice channel to skip the music."
+msgstr "Du musst dich in dem Sprachkanal befinden, um Titel zu überspringen."
+
+#: redbot/cogs/audio/audio.py:2543
+msgid "Turn shuffle off to use this command."
+msgstr "Schalte die zufällige Wiedergabe aus, um diesen Befehl zu verwenden."
+
+#: redbot/cogs/audio/audio.py:2545
+msgid "No previous track."
+msgstr "Kein vorheriger Titel."
+
+#: redbot/cogs/audio/audio.py:2562
+msgid "Replaying Track"
+msgstr "Titel wird wiederholt"
+
+#: redbot/cogs/audio/audio.py:2571
+#, docstring
+msgid "List the songs in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2622
+msgid "**Currently livestreaming:**"
+msgstr "**Aktueller Livestream:**"
+
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
+msgid "Playing: "
+msgstr "Gerade läuft: "
+
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
+msgid "Requested by: **{user}**"
+msgstr "Angefragt von: **{user}**"
+
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
+msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
+msgstr "Seite {page_num}/{total_pages} | {num_tracks} Titel, {num_remaining} verbleibend"
+
+#: redbot/cogs/audio/audio.py:2693
+msgid "Repeat"
+msgstr "Wiederholen"
+
+#: redbot/cogs/audio/audio.py:2695
+msgid "Shuffle"
+msgstr "Zufällige Wiedergabe"
+
+#: redbot/cogs/audio/audio.py:2740
+msgid "Matching Tracks:"
+msgstr "Passende Titel:"
+
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
+msgid "Page {page_num}/{total_pages}"
+msgstr "Seite {page_num}/{total_pages}"
+
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr "Leert die Playlist."
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr "Du brauchst die DJ Rolle um die Playlist zu leeren."
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr "Die Playlist wurde geleert."
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr "Entfernt Lieder von der Playlist, wenn der Autor nicht im Voice Channel ist."
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr "Du brauchst die DJ Rolle um die Playlist zu leeren."
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr "0 Lieder entfernt."
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr "Es wurden Lieder entfernt die von Leuten außerhalb des Voice Channels angefordert wurden: {removed_tracks}."
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
+#, docstring
+msgid "Toggle repeat."
+msgstr "Wiederholung umschalten."
+
+#: redbot/cogs/audio/audio.py:2835
+msgid "You need the DJ role to toggle repeat."
+msgstr "Du benötigst die DJ Rolle um Wiederholung umzuschalten."
+
+#: redbot/cogs/audio/audio.py:2843
+msgid "You must be in the voice channel to toggle repeat."
+msgstr "Du musst dich in dem Sprachkanal befinden, um Wiederholung umzuschalten."
+
+#: redbot/cogs/audio/audio.py:2849
+msgid "Repeat tracks: {true_or_false}."
+msgstr "Titel wiederholen: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:2857
+#, docstring
+msgid "Remove a specific track number from the queue."
+msgstr "Entferne einen bestimmten Titel aus der Warteschlange."
+
+#: redbot/cogs/audio/audio.py:2863
+msgid "Nothing queued."
+msgstr "Nichts eingereiht."
+
+#: redbot/cogs/audio/audio.py:2866
+msgid "You need the DJ role to remove tracks."
+msgstr "Du benötigst die DJ Rolle um Titel zu entfernen."
+
+#: redbot/cogs/audio/audio.py:2871
+msgid "You must be in the voice channel to manage the queue."
+msgstr "Du musst dich in dem Sprachkanal befinden, um die Warteschlange zu verwalten."
+
+#: redbot/cogs/audio/audio.py:2887
+msgid "Removed {track} from the queue."
+msgstr "{track} aus der Warteschlange entfernt."
+
+#: redbot/cogs/audio/audio.py:2894
+#, docstring
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2958
+msgid "You must be in the voice channel to enqueue tracks."
+msgstr "Du musst dich in dem Sprachkanal befinden, um Titel einzureihen."
+
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3003
+msgid "{time} until start of search playback: starts at #{position} in queue"
+msgstr "{time} bis zum Start der Wiedergabesuche: startet an #{position} in der Warteschlange"
+
+#: redbot/cogs/audio/audio.py:3169
+msgid "Tracks Found:"
+msgstr "Titel gefunden:"
+
+#: redbot/cogs/audio/audio.py:3170
+msgid "search results"
+msgstr "Suchergebnisse"
+
+#: redbot/cogs/audio/audio.py:3173
+msgid "Folders Found:"
+msgstr "Ordner gefunden:"
+
+#: redbot/cogs/audio/audio.py:3174
+msgid "local folders"
+msgstr "lokale Ordner"
+
+#: redbot/cogs/audio/audio.py:3176
+msgid "Files Found:"
+msgstr "Dateien gefunden:"
+
+#: redbot/cogs/audio/audio.py:3177
+msgid "local tracks"
+msgstr "lokale Titel"
+
+#: redbot/cogs/audio/audio.py:3195
+#, docstring
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3206
+msgid "You must be in the voice channel to use seek."
+msgstr "Du musst dich in dem Sprachkanal befinden, um Spulen zu können."
+
+#: redbot/cogs/audio/audio.py:3211
+msgid "You need the DJ role to use seek."
+msgstr "Du benötigst die DJ Rolle, um zu Spulen."
+
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
+msgid "There are other people listening - vote to skip instead."
+msgstr "Es hören andere Leute zu - stimme stattdessen zum Überspringen ab."
+
+#: redbot/cogs/audio/audio.py:3221
+msgid "Can't seek on a stream."
+msgstr "Ein Stream kann nicht gespult werden."
+
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
+msgid "Moved {num_seconds}s to 00:00:00"
+msgstr "Verschiebe {num_seconds}s nach 00:00:00"
+
+#: redbot/cogs/audio/audio.py:3241
+msgid "Moved {num_seconds}s to {time}"
+msgstr "Verschiebe {num_seconds}s nach {time}"
+
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
+#, docstring
+msgid "Toggle shuffle."
+msgstr "Schalte zufällige Wiedergabe um."
+
+#: redbot/cogs/audio/audio.py:3265
+msgid "You need the DJ role to toggle shuffle."
+msgstr "Du benötigst die DJ Rolle, um zufällige Wiedergabe umzuschalten."
+
+#: redbot/cogs/audio/audio.py:3273
+msgid "You must be in the voice channel to toggle shuffle."
+msgstr "Du musst dich in dem Sprachkanal befinden, um zufällige Wiedergabe umzuschalten."
+
+#: redbot/cogs/audio/audio.py:3279
+msgid "Shuffle tracks: {true_or_false}."
+msgstr "Zufällige Wiedergabe: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:3287
+#, docstring
+msgid "Make Red sing one of her songs."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3303
+#, docstring
+msgid "Skip to the next track, or to a given track number."
+msgstr "Überspringe zum nächsten Lied oder geben eine Nummer für ein Lied an."
+
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr "Kann ohne DJ Rolle nicht auf einen bestimmten Track im Abstimmmodus überspringen."
+
+#: redbot/cogs/audio/audio.py:3326
+msgid "I removed your vote to skip."
+msgstr "Ich habe deine Stimme zum Überspringen entfernt."
+
+#: redbot/cogs/audio/audio.py:3329
+msgid "You voted to skip."
+msgstr "Du hast für das Überspringen gestimmt."
+
+#: redbot/cogs/audio/audio.py:3342
+msgid "Vote threshold met."
+msgstr "Abstimmungsschwelle erreicht."
+
+#: redbot/cogs/audio/audio.py:3345
+msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
+msgstr " Abstimmungen: {num_votes}/{num_members} ({cur_percent}% von {required_percent}% erforderlich)"
+
+#: redbot/cogs/audio/audio.py:3425
+msgid "Currently livestreaming {track}"
+msgstr "Livestreame derzeit {track}"
+
+#: redbot/cogs/audio/audio.py:3432
+msgid "{time} left on {track}"
+msgstr "{time} Zeit übrig von {track}"
+
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr "Die Nummer, des Liedes, muss größer oder gleich 1 sein."
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr "Kann nicht auf einen Track überspringen, während der Shuffle Modus aktiviert ist."
+
+#: redbot/cogs/audio/audio.py:3470
+msgid "Track Skipped"
+msgstr "Titel übersprungen"
+
+#: redbot/cogs/audio/audio.py:3493
+#, docstring
+msgid "Stop playback and clear the queue."
+msgstr "Stoppe Wiedergabe und leere die Warteschlange."
+
+#: redbot/cogs/audio/audio.py:3503
+msgid "You must be in the voice channel to stop the music."
+msgstr "Du musst dich in dem Sprachkanal befinden, um die Wiedergabe zu stoppen."
+
+#: redbot/cogs/audio/audio.py:3514
+msgid "You need the DJ role to stop the music."
+msgstr "Du benötigst die DJ Rolle, um die Wiedergabe zu stoppen."
+
+#: redbot/cogs/audio/audio.py:3516
+msgid "Stopping..."
+msgstr "Stoppe..."
+
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
+#, docstring
+msgid "Set the volume, 1% - 150%."
+msgstr "Setze die Lautstärke, 1% - 150%."
+
+#: redbot/cogs/audio/audio.py:3571
+msgid "Current Volume:"
+msgstr "Aktuelle Lautstärke:"
+
+#: redbot/cogs/audio/audio.py:3583
+msgid "You must be in the voice channel to change the volume."
+msgstr "Du musst dich in dem Sprachkanal befinden, um die Lautstärke zu verändern."
+
+#: redbot/cogs/audio/audio.py:3589
+msgid "You need the DJ role to change the volume."
+msgstr "Du benötigst die DJ Rolle, um die Lautstärke zu ändern."
+
+#: redbot/cogs/audio/audio.py:3602
+msgid "Volume:"
+msgstr "Lautstärke:"
+
+#: redbot/cogs/audio/audio.py:3613
+#, docstring
+msgid "Lavalink server configuration options."
+msgstr "Lavalink Server Konfigurationsoptionen."
+
+#: redbot/cogs/audio/audio.py:3618
+#, docstring
+msgid "Toggle using external lavalink servers."
+msgstr "Schalte Benutzung von externem Lavalink Server um."
+
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
+msgid "External lavalink server: {true_or_false}."
+msgstr "Externer Lavalink Server: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:3642
+#, docstring
+msgid "Set the lavalink server host."
+msgstr "Lege den Lavalink Server Host fest."
+
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
+msgid "Host set to {host}."
+msgstr "Host gesetzt auf {host}."
+
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
+msgid "External lavalink server set to True."
+msgstr "Externer Lavalink Server gesetzt auf Wahr."
+
+#: redbot/cogs/audio/audio.py:3657
+#, docstring
+msgid "Set the lavalink server password."
+msgstr "Lege das Lavalink Server Passwort fest."
+
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
+msgid "Server password set to {password}."
+msgstr "Server Passwort auf {password} gesetzt."
+
+#: redbot/cogs/audio/audio.py:3675
+#, docstring
+msgid "Set the lavalink REST server port."
+msgstr "Lege den Lavalink REST Server Port fest."
+
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
+msgid "REST port set to {port}."
+msgstr "REST Port auf {port} gesetzt."
+
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
-msgstr ""
+msgstr "Lege den Lavalink Websocket Server Port fest."
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
-msgstr ""
+msgstr "Websocket Port auf {port} gesetzt."
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
-msgstr ""
+msgstr "Nicht genug {currency} ({required_credits} erforderlich)."
diff --git a/redbot/cogs/audio/locales/el-GR.po b/redbot/cogs/audio/locales/el-GR.po
index 9c31265d8..ace3dbd52 100644
--- a/redbot/cogs/audio/locales/el-GR.po
+++ b/redbot/cogs/audio/locales/el-GR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: el_GR\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/en-PT.po b/redbot/cogs/audio/locales/en-PT.po
index a4e5f2dd9..368476580 100644
--- a/redbot/cogs/audio/locales/en-PT.po
+++ b/redbot/cogs/audio/locales/en-PT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Pirate English\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: en_PT\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/es-ES.po b/redbot/cogs/audio/locales/es-ES.po
index 6782ac567..c5a0a5c93 100644
--- a/redbot/cogs/audio/locales/es-ES.po
+++ b/redbot/cogs/audio/locales/es-ES.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: es_ES\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
-msgstr ""
+msgstr "Reproducir audio a través de canales de voz."
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
-msgstr ""
+msgstr "música en {} servidores"
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr "Escuchando"
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr "Longitud de la pista: {length} | Solicitado por: {user}"
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
-msgstr ""
+msgstr "Cola terminada."
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
-msgstr ""
+msgstr "Error de pista"
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
-msgstr ""
+msgstr "Omitiendo..."
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
-msgstr ""
+msgstr "Opciones de configuración de música."
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:265
-msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:273
-msgid "Response timed out, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:284
-#, docstring
-msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
-msgid "Can't be less than zero."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:291
-msgid "Empty disconnect disabled."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:296
-msgid "Empty disconnect timer set to {num_seconds}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
-#, docstring
-msgid "Set a price for queueing tracks for non-mods. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:320
-msgid "Jukebox mode disabled."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:325
-msgid "Track queueing command price set to {price} {currency}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:336
-#, docstring
-msgid "Toggle track announcement and other bot messages."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:340
-msgid "Verbose mode on: {true_or_false}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:345
-#, docstring
-msgid "Show the current settings."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:358
-msgid "Server Settings"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+msgid "Auto-disconnection at queue end: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:385
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
-msgstr ""
+#: redbot/cogs/audio/audio.py:392
+msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
+msgstr "Por favor, establezca un rol para usar con el modo DJ. Introduzca el nombre de rol o ID ahora."
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+#: redbot/cogs/audio/audio.py:400
+msgid "Response timed out, try again later."
+msgstr "Respuesta expirada, inténtalo de nuevo más tarde."
+
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
msgstr ""
#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
+#, docstring
+msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
+msgstr "Desconexión automática después de x segundos mientras se detuvo. 0 para desactivar."
+
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
+msgid "Can't be less than zero."
+msgstr "No puede ser menor que cero."
+
+#: redbot/cogs/audio/audio.py:418
+msgid "Empty disconnect disabled."
+msgstr "Desconexion vacia desactivada."
+
+#: redbot/cogs/audio/audio.py:423
+msgid "Empty disconnect timer set to {num_seconds}."
+msgstr "Se ha establecido un temporizador de desconexión en {num_seconds}."
+
+#: redbot/cogs/audio/audio.py:434
+#, docstring
+msgid "Set a price for queueing tracks for non-mods. 0 to disable."
+msgstr "Establecer un precio para las pistas de cola para no mods. 0 para deshabilitar."
+
+#: redbot/cogs/audio/audio.py:439
+msgid "Jukebox mode disabled."
+msgstr "Modo Jukebox desactivado."
+
+#: redbot/cogs/audio/audio.py:444
+msgid "Track queueing command price set to {price} {currency}."
+msgstr "Rastrear el precio de comando en cola establecido en {price} {currency}."
+
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
msgstr ""
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
+#, docstring
+msgid "Toggle track announcement and other bot messages."
+msgstr "Alternar anuncio de la pista y otros mensajes de bot."
+
+#: redbot/cogs/audio/audio.py:563
+msgid "Verbose mode on: {true_or_false}."
+msgstr "Modo Verboso en: {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr "Establecer el rol a utilizar para el modo DJ."
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr "Rol de DJ establecido en: {role.name}."
+
+#: redbot/cogs/audio/audio.py:589
+#, docstring
+msgid "Show the current settings."
+msgstr "Mostrar los ajustes actuales."
+
+#: redbot/cogs/audio/audio.py:604
+msgid "Server Settings"
+msgstr "Ajustes del servidor"
+
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
+#, docstring
+msgid "Instructions to set the Spotify API tokens."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/fi-FI.po b/redbot/cogs/audio/locales/fi-FI.po
index a7ed5f9db..3a8c4f9ce 100644
--- a/redbot/cogs/audio/locales/fi-FI.po
+++ b/redbot/cogs/audio/locales/fi-FI.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-14 02:15\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Finnish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: fi_FI\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/fr-FR.po b/redbot/cogs/audio/locales/fr-FR.po
index e127d0424..bf7ca681b 100644
--- a/redbot/cogs/audio/locales/fr-FR.po
+++ b/redbot/cogs/audio/locales/fr-FR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:06\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:12\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,989 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: fr_FR\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
-msgstr "Joue de l'audio au travers des salons vocaux."
+msgstr "Lire l'audio au travers des salons vocaux."
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
+#: redbot/cogs/audio/audio.py:260
+msgid "music in {} servers"
+msgstr "musique dans {} serveurs"
+
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
msgid "Now Playing"
-msgstr "En cours"
+msgstr "Lecture en cours"
-#: redbot/cogs/audio/audio.py:177
+#: redbot/cogs/audio/audio.py:304
msgid "Track length: {length} | Requested by: {user}"
msgstr "Durée de la piste : {length} | Demandé par {user}"
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
-msgid "music in {} servers"
-msgstr "de la musique sur {} serveurs"
-
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr "Liste terminée."
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr "Erreur de la piste"
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr "Changement de musique ..."
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr "Options de configuration pour la musique."
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
-msgstr "Active le mode DJ.\n\n"
-" Le mode DJ autorise les utilisateurs avec le rôle DJ d'utiliser les commandes audio.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
+msgstr "Activer/désactiver la fonction de déconnexion automatique du bot dès lors que la lecture est terminée.\\n\\n Ce réglage prends le pas sur [p]audioset emptydisconnect.\\n "
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr "Déconnexion automatique à la fin de la file d'attente : {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr "Active le mode DJ.\\n\\n Le mode DJ autorise les utilisateurs avec le rôle DJ d'utiliser les commandes audio.\\n "
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr "Définissez s'il vous plaît un rôle à utiliser avec le mode DJ. Entrez maintenant le nom du rôle ou son ID."
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
-msgstr "Expiration de la réponse, réessayez plus tard."
+msgstr "Réponse expirée, réessayez plus tard."
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr "Rôle DJ activé : {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr "Déconnexion automatique après x seconds à l'arrêt. 0 pour désactiver."
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
-msgstr "Ne peut être inférieur à zero."
+msgstr "Ne peut être inférieur à zéro."
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr "Déconnexion si aucune lecture désactivé."
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
-msgstr "Délai de déconnexion automatique lorsque tout est vide réglé à {num_seconds}."
+msgstr "Délai de déconnexion automatique si aucune lecture réglé à {num_seconds}."
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr "Défini le rôle à utiliser pour le mode DJ."
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr "Le rôle DJ à été défini sur : {role.name}."
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
-msgstr "Définir un prix pour que les non modérateurs puissent lister des pistes. 0 pour désactiver."
+msgstr "Définir un prix pour que les non-modérateurs puissent lister des pistes. 0 pour désactiver."
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
-msgstr "Le mode jukebox à été désactiver."
+msgstr "Le mode jukebox à été désactivé."
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr "Le prix de la commande de liste est défini à {price}{currency}."
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr "Définir le chemin des musiques locales si le fichier Lavalink.jar n'est pas exécuté à partir du dossier de données audio.\\n\\n Laisser le chemin vide pour réinitialiser le chemin à l'origine qui est le répertoire des données audio.\\n "
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr "L'emplacement du chemin des musiques locales a été réinitialisé à l'emplacement par défaut."
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr "{local_path} ne semble pas être un chemin valide."
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr "Le chemin qui a été saisi n'a pas de fichier {filelist} dans cet emplacement. Le chemin sera quand même sauvegardé, mais veuillez vérifier le chemin et l'emplacement du fichier avant de tenter de jouer des pistes locales ou de démarrer votre fichier Lavalink.jar."
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr "Chemin de localisation défini à : {local_path}."
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr "Longueur max de piste désactivée."
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr "Longueur max de piste définie sur {seconds}."
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr "Activer/désactiver l’annonce du changement de piste et d’autres messages de bot."
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
-msgstr "Mode détaillé sur: {true_or_false}."
+msgstr "Mode détaillé sur : {true_or_false}."
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr "Active la restriction de domaine dans l'Audio.\\n\\n Lorsque activé, les utilisateurs pourront jouer des musiques à partir de sites Web et de liens non commerciaux.\\n Lors qu’actif, les utilisateurs sont limités à YouTube, SoundCloud, Mixer, Vimeo, Twitch et Bandcamp."
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr "Liens commerciaux seulement : {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr "Défini le rôle à utiliser pour le mode DJ."
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr "Le rôle DJ à été défini sur : {role.name}."
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr "Afficher les paramètres actuels."
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr "Paramètres du serveur"
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
-msgstr "Temps de déconnexion : [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
+msgstr "Déconnexion automatique : [{dc}]\\n"
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
-msgstr "Rôle DJ : [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
+msgstr "Temps de déconnexion : [{num_seconds}]\\n"
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
-msgstr "Jukebox : [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
+msgstr "Rôle DJ : [{role.name}]\\n"
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
-msgstr "Prix de la commande : [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
+msgstr "Jukebox : [{jukebox_name}]\\n"
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
-msgstr "Répétition : [{repeat}]\n"
-"Aléatoire : [{shuffle}]\n"
-"Notif musiques : [{notify}]\n"
-"Musiques en statut : [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
+msgstr "Prix de la commande : [{jukebox_price}]\\n"
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
-msgstr "Vignettes : [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
+msgstr "Longueur maximale de la piste : [{tracklength}]\\n"
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
-msgstr "Votes pour changement : [{vote_enabled}]\n"
-"Pourcentage de changement : [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
+msgstr "Répétition : [{repeat}]\\nAléatoire : [{shuffle}]\\nNotif musiques : [{notify}]\\nMusiques en statut : [{status}]\\n"
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
-msgstr "---Paramètres de Lavalink---\n"
-"Version du Cog : [{version}]\n"
-"Version Jar : [{jarbuild}]\n"
-"Serveur externe : [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
+msgstr "Vignettes : [{0}]\\n"
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr "Votes pour changement : [{vote_enabled}]\\nPourcentage de changement : [{vote_percent}%]\\n"
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr "---Paramètres de Lavalink--- \\nVersion du Cog : [{version}]\\nVersion du fichier Jar : [{jarbuild}]\\nServeur externe : [{use_external_lavalink}]\\n"
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr "Chemin de localisation des musiques locales : [{localpath}]\\n"
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
-msgstr "Activer/désactiver l’affichage d’une vignette sur les messages de l'audio."
+msgid "Instructions to set the Spotify API tokens."
+msgstr "Instructions pour définir les tokens de l'API Spotify."
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
-msgstr "Affichage des vignettes : {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
+msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr "Pourcentage nécessaire pour que les non modérateurs puissent changer de piste. 0 pour désactiver."
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr "Votes désactivés. Tout les utilisateurs peuvent maintenant utiliser les commandes de gestion de la file."
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr "Pourcentage de vote défini à {percent} %."
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr "Activer/désactiver titres des pistes comme statut."
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr "Titres de musiques comme statut : {true_or_false}."
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr "Activer/désactiver l’affichage d’une vignette sur les messages de l'audio."
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr "Affichage des vignettes : {true_or_false}."
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr "Pourcentage nécessaire pour que les non-modérateurs puissent changer de piste. 0 pour désactiver."
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr "Votes désactivés. Tout les utilisateurs peuvent maintenant utiliser les commandes de gestion de la file."
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr "Pourcentage de vote défini à {percent} %."
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr "Instructions pour définir la clé de l'API YouTube."
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr "Stats de l’audio."
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr "Aucune lecture en cours."
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr "Connecté nul part."
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
-msgstr "Connecté sur {num} serveurs :"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
+msgstr "Lecture dans {num}/{total} serveurs :"
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr "Remonte un numéro de piste vers le haut de la liste."
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr "Vous devez être dans un salon vocal pour remonter une piste."
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr "Vous devez avoir le rôle DJ pour remonter des pistes."
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr "Le numéro d'une musique doit être supérieur à 1 et dans la limite de la file."
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr "{track} a été déplacé en haut de la liste."
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr "Déconnexion du salon vocal."
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr "Vous devez avoir le rôle DJ pour pouvoir déconnecter."
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr "Il y a d’autres personnes écoutant de la musique."
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr "Gestion de l'égaliseur."
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr "Supprimer un préréglage eq enregistré."
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr "Liste des préréglages eq enregistrés."
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr "Aucun préréglage de l'égaliseur enregistré."
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr "{num} préréglage(s)"
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr "Charger un preset eq enregistré."
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr "Réinitialiser l'eq à 0 sur toutes les bandes."
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr "Les valeurs de l'égaliseur ont été réinitialisées."
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr "Enregistrer les paramètres eq actuels dans un préréglage."
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr "Veuillez saisir un nom pour ce préréglage d'égaliseur."
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr "Aucun nom de préréglage d'égaliseur saisi, essayez à nouveau la commande plus tard."
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr "Réessayez la commande avec un nom plus court."
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr "Le nom du préréglage existe déjà, voulez-vous le remplacer ?"
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr "Pas d'enregistrement du préréglage."
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr "Réglez une bande d'égalisation avec un numéro de bande ou un nom et une valeur. \\n\\n\\n Les positions de bande sont 1-15 et les valeurs ont une plage de -0,25 à 1,0. \\n Les noms de bande sont 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1,6k, 2,5k, 4k, 6,3k, 10k et 16k Hz.\\n Une valeur de bande à -0,25 la rend nulle alors que +0,25 est double.\\n "
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr "Les numéros de bande valides sont de 1 à 15 ou les noms de bande listés dans l'aide de cette commande."
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr "Commandes de lecture locale."
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr "Lire toutes les chansons dans un dossier localtracks."
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr "Aucun dossier de musiques locales nommé {name}."
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr "Lire une piste locale."
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr "Aucun dossier de pistes locales trouvé."
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr "Rechercher des musiques dans tout les dossiers de localtracks."
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr "Aucun dossier d'album trouvé."
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr "Aucune correspondance."
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr "Aucun dossier de localtracks."
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr "Lecture en cours."
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr "Demandé par : **{track.requester} **"
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr "Rien."
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
-msgstr "Interrompre et reprendre."
+msgid "Pause or resume a playing track."
+msgstr "Pause ou reprise de la lecture d'une piste."
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
-msgstr "Vous devez être dans un salon vocal pour mettre en pause la musique."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
+msgstr "Vous devez être dans un salon vocal pour mettre en pause ou reprendre la lecture."
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
-msgstr "Vous devez avoir le rôle DJ pour mettre en pause des pistes."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
+msgstr "Vous devez avoir le rôle DJ pour mettre en pause ou reprendre la lecture."
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr "La piste à été mise en pause"
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr "La piste à repris"
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr "Piste en pause."
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr "La piste est en cours de lecture."
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr "Pourcentage de la liste."
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr "Rien dans la liste."
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr "Dans la liste et en cours de lecture :"
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr "Joue une URL ou cherche une piste."
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr "Cette URL n'est pas autorisée."
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr "La connexion à Lavalink a échoué."
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr "Veuillez vérifier votre console ou les logs pour plus de détails."
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr "Je n'ai pas la permission de me connecter à votre salon."
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr "Rejoignez un salon vocal d'abord."
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
-msgstr ""
+msgstr "La connexion à Lavalink n'a pas encore été établie."
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr "Vous devez avoir le rôle DJ pour ajouter des pistes à la liste."
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr "Vous devez être dans un salon vocal pour utiliser la commande play."
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr "Aucune piste à jouer."
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr "Attendre jusqu'à ce que la playlist finisse de charger."
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr "Aucun résultat."
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr "Cela ne semble pas être une URL ou un code Spotify valide."
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr "Playlist en file d’attente"
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
-msgstr "{num} titres ajoutés à la liste."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
+msgstr "Ajout de {num} pistes à la file d'attente.{maxlength_msg}"
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr "{time} avant le début de la lecture de la playlist : commence à #{position} dans la liste"
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr "Cette piste dépasse la limite maximale."
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr "Rien n'a été trouvé. Vérifiez vos logs Lavalink pour plus de détails."
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr "Piste ajoutée"
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr "{time} avant la lecture de la piste : #{position} dans la file d’attente"
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr "#{position} dans la liste"
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr "Veuillez patienter, ajout de pistes ..."
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr "La connexion a été réinitialisée lors du chargement de la playlist."
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr "Chargement de piste {num}/{total} ..."
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr "Temps approximatif restant: {seconds}"
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr "Rien n'a été trouvé.\\nLa clé de l'API YouTube peut être invalide ou vous pouvez être limité sur le service de recherche de YouTube.\\nVérifiez à nouveau la clé de l'API YouTube et suivez les instructions à `{prefix}audioset youtubeapi`."
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr "Options de configuration des playlists."
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
-msgstr "Ajouter l'URL d'une ou plusieurs musiques musiques, d'une playlist ou une recherche rapide vers une playlist.\n\n"
-" Le(s) musique(s) seront ajoutées à la fin de la playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
+msgstr "Ajouter l'URL d'une ou plusieurs musiques musiques, d'une playlist ou une recherche rapide vers une playlist.\\n\\n La(les) musique(s) seront ajoutées à la fin de la playlist.\\n "
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr "Vous n’êtes pas l’auteur de cette playlist."
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr "{track} est déjà dans {playlist}."
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr "Aucune playlist portant ce nom."
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr "{track} ajouté à {playlist}."
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr "{num} pistes ajoutées à {playlist}."
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr "Copiez une playlist d'un serveur à un autre."
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr "ID de serveur invalide pour le serveur source."
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr "ID de serveur invalide pour le serveur cible."
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr "Aucune playlist avec ce nom dans {from_guild_name}."
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr "Playlist {name} copiée de {from_guild_name} à {to_guild_name}."
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr "Une playlist avec ce nom existe déjà dans {to_guild_name}.\\nVeuillez entrer un nouveau nom pour cette playlist."
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr "Essayez à nouveau la commande de copie de la playlist avec un nom plus court."
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr "Ce nom de playlist existe déjà dans {to_guild_name}, essayez à nouveau la commande de copie de la playlist avec un nom différent."
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr "Aucun nom de playlist entré, réessayez plus tard."
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr "Playlist {name} copiée de {from_guild_name} à {to_guild_name}.\\nNouveau nom de playlist sur {to_guild_name}: {new_name}"
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr "Créer une playlist vide."
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr "Vous devez avoir le rôle DJ pour sauvegarder les playlists."
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr "Ce nom de playlist existe déjà, essayez à nouveau avec un nom différent."
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr "Playlist vide nommée {name} créé."
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr "Supprimer une playlist enregistrée."
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr "La playlist {name} à été supprimée."
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr "Téléchargez une copie d'une playlist.\\n\\n Ces fichiers peuvent être utilisés avec la commande de téléchargement des playlists `[p]playlist upload`.\\n Les listes de lecture compatibles avec la v2 de Red peuvent être générées en passant par True\\n pour la variable v2."
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr "Cette playlist ne contient aucune piste."
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr "Cette playlist n'existe pas."
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr "Récupérer les informations d’une playlist enregistrée."
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
-msgstr "**Playlist personnalisée.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
+msgstr "Infos de la playlist pour {playlist_name} :\\n"
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
-msgstr "URL : <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
+msgstr "Infos de la playlist pour {playlist_name} :\\nURL: {url}"
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
-msgstr "Infos de la playlist pour {playlist_name} :"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
+msgstr "Auteur : {author_name} | {num} piste(s)"
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr "Auteur : **{author_name}**\n"
-"{url}"
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr "{num} piste(s)"
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr "Liste les playlists enregistrées."
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr "Aucunes playlists enregistrées."
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr "Pistes : {num}"
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
-msgstr "Auteur : {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
+msgstr "Auteur : {name}\\n"
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr "Playlists de {server_name} :"
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr "Page {page_num}/{total_pages} | {num} playlists"
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr "Enregistrer la file dans une playlist."
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr "Il n'y a rien dans la liste."
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr "Veuillez entrer un nom pour cette playlist."
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr "Réessayez la commande avec un nom plus court."
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr "Aucun nom de playlist entré, réessayez plus tard."
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr "Playlist {name} venant de la file actuelle : {num} titres ajoutés."
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
-msgstr "Enlève une piste d'une playlist avec une Url."
+msgstr "Supprimer une piste d'une playlist par url."
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr "L'url n'est pas dans la playlist."
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
-msgstr "Il ne reste plus aucune pistes, retrait de la playlist."
+msgstr "Aucune piste restante, suppression de la playlist."
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr "{num} musiques ont été retirées de la playlist {playlist_name}."
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr "La piste a été retirée de la playlist {playlist_name}."
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
-msgstr "Enregistrer une playlist depuis une url."
+msgstr "Enregistrer une playlist à partir d'une url."
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr "Playlist {name} enregistrée : {num} titres ajoutés."
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr "Charger une playlist dans la file."
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr "Cette playlist n'existe pas."
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr "Convertir un fichier de playlist venant de la v2 de Red vers une playlist."
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr "Envoyez s'il vous plaît le fichier de playlist. Tout autre message annulera cette opération."
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr "Aucun fichier détecté, réessayez plus tard."
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr "Transfert annulé."
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr "Seuls les fichiers de playlist peuvent être transférés."
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
-msgstr "Fichier de playlist non valide."
+msgstr "Fichier de playlist invalide."
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr "Une playlist existe déjà avec ce nom."
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr "Veuillez patienter, ajout de pistes ..."
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr "Chargement de piste {num}/{total} ..."
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr "Aucune piste trouvée."
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr "{num} pistes de la playlist {playlist_name} ont été ajoutés. {num_bad} piste(s) n’ont pu être chargé."
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr "{num} pistes de la playlist {playlist_name} ont été ajoutés."
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr "Playlist enregistrée"
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr "Vous devez avoir le rôle DJ pour utiliser les playlists."
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr "Vous devez être dans le salon vocal pour utiliser la commande de playlist."
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr "Revient à la piste précédente."
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr "Vous devez avoir le rôle DJ pour passer des pistes."
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr "Vous devez être dans un salon vocal pour passer une musique."
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr "Enlevez l'aléatoire pour utiliser cette commande."
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr "Il n'y a pas de piste précédente."
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr "Répétition de piste"
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
-msgstr "Affiche la file d'attente.\n\n"
-" Utilisez [p]queue search pour rechercher dans la file d'attente.\n"
-" "
+msgid "List the songs in the queue."
+msgstr "Lister les musiques dans la file d'attente."
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr "Il n'y a rien dans la liste."
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr "**Actuellement en streaming :**"
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr "Lecture en cours : "
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
-msgstr "Demandé par : **{user} **\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
+msgstr "Demandé par : **{user} **\\n"
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr "Demandé par : **{user} **\\n"
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr "Demandé par : **{user} **"
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
-msgstr "demandé par : **{user} **\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
+msgstr "demandé par : **{user} **\\n"
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr "demandé par **{user} **\\n"
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr "demandé par **{user}**\\n"
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr "Page {page_num}/{total_pages} | {num_tracks} pistes, {num_remaining} restant"
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr "Répétition"
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr "Aléatoire"
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr "Pistes correspondantes :"
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr "Page {page_num}/{total_pages}"
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr "Vide la file d'attente."
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr "Vous devez avoir le rôle DJ pour effacer la file d'attente."
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr "La file d'attente a été effacée."
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr "Supprime les musiques de la file d'attente si la personne qui l'a choisi n'est pas dans le salon vocal."
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr "Vous devez avoir le rôle DJ pour effacer la file d'attente."
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr "0 pistes supprimées."
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr "{removed_tracks} pistes supprimées qui avaient été ajoutées par des membres hors du salon vocal."
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr "Rechercher dans la file d'attente."
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr "Activer la répétition."
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr "Vous devez avoir le rôle DJ pour activer la répétition."
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr "Vous devez être dans un salon vocal pour activer la répétition."
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr "Répétition des pistes : {true_or_false}."
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr "Supprime un numéro de piste spécifique de la liste."
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr "Rien dans la liste."
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr "Vous devez avoir le rôle DJ pour enlever des pistes."
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr "Vous devez être dans un salon vocal pour enlever des pistes."
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr "{track} a été retirer de la liste."
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
-msgstr "Choisissez une piste avec une recherche.\n\n"
-" Utilisez `[p]search list ` pour mettre dans la liste\n"
-" toutes les pistes trouvées sur YouTube. `[p]search sc `\n"
-" permet de rechercher sur SoundCloud au lieu de YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
+msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr "Vous devez être dans un salon vocal pour ajouter des pistes."
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
-msgstr "{num} piste(s) ajoutée(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
+msgstr "{num} piste(s) ajoutée(s).{maxlength_msg}"
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr "{time} avant le début de la lecture de la recherche : commence à #{position} dans la liste"
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr "Pistes trouvées :"
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr "résultats de la recherche"
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr "Dossiers trouvés :"
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr "dossiers locaux"
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr "Fichiers trouvés :"
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr "titres locaux"
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
-msgstr "Revenir en arrière ou avancer une piste en secondes."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
+msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr "Vous devez être dans un salon vocal pour utiliser la commande seek."
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr "Vous devez avoir le rôle DJ pour utiliser la commande seek."
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr "Il existe d’autres personnes en train d'écouter - vote pour passer à la place."
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr "Ne peut avancer ou reculer sur un stream."
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr "Déplacé de {num_seconds}s à 00:00:00"
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr "Déplacé de {num_seconds}s à {time}"
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr "Activer/désactiver l'aléatoire."
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr "Vous devez avoir le rôle DJ pour activer l'aléatoire."
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr "Vous devez être dans un salon vocal pour activer l'aléatoire."
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr "Mélanger les pistes : {true_or_false}."
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
-msgstr "Fait chanter une des chansons de Red"
+msgid "Make Red sing one of her songs."
+msgstr "Fait chanter une des musiques de Red."
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
-msgstr "Passer à la piste suivante."
+msgid "Skip to the next track, or to a given track number."
+msgstr "Passez à la piste suivante, ou à un numéro de piste donné."
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr "Impossible de passer à une piste spécifique en mode vote sans le rôle DJ."
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr "J’ai enlevé votre vote pour passer."
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr "Vous avez voté pour passer."
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr "Seuil de vote atteint."
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr " Votes : {num_votes}/{num_members} ({cur_percent}%, {required_percent}% requis)"
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr "Actuellement en streaming {track}"
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr "{time} restant sur {track}"
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr "Le numéro de piste doit être égal ou supérieur à 1."
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr "Impossible de passer à une piste pendant que l'aléatoire est activé."
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr "Piste passée"
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr "La lecture a été stoppée et la liste vidée."
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr "Vous devez être dans un salon vocal pour arrêter la musique."
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr "Vous devez avoir le rôle DJ pour arrêter la musique."
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr "Arrêt ..."
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr "Invoquez le bot dans un salon vocal."
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr "Vous avez besoin du rôle DJ pour invoquer le bot."
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr "Réglage du volume, 1 % à 150 %."
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr "Volume actuel :"
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr "Vous devez être dans un salon vocal pour changer le volume."
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr "Vous devez avoir le rôle DJ pour changer le volume."
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr "Volume :"
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr "Options de configuration du serveur Lavalink."
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr "Activer/désactiver l'usage de serveurs externes Lavalink."
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr "Serveur externe Lavalink : {true_or_false}."
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr "Réinitialisation des paramètres par défaut."
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr "Définir l’hôte du serveur lavalink."
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr "Hôte défini à {host}."
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr "Serveur externe lavalink défini sur True."
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr "Définir le mot de passe du serveur lavalink."
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr "Mot de passe serveur défini à {password}."
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr "Définir le port REST du serveur lavalink."
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr "Port REST défini sur {port}."
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr "Définir le port du websocket du serveur lavalink."
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr "Port websocket défini sur {port}."
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr "Pas assez de {currency} ({required_credits} voulu)."
diff --git a/redbot/cogs/audio/locales/hu-HU.po b/redbot/cogs/audio/locales/hu-HU.po
index 9c2a50f8f..868fbfe29 100644
--- a/redbot/cogs/audio/locales/hu-HU.po
+++ b/redbot/cogs/audio/locales/hu-HU.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Hungarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: hu_HU\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/id-ID.po b/redbot/cogs/audio/locales/id-ID.po
index bfe212e4b..d9320b5e1 100644
--- a/redbot/cogs/audio/locales/id-ID.po
+++ b/redbot/cogs/audio/locales/id-ID.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Indonesian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: id_ID\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/it-IT.po b/redbot/cogs/audio/locales/it-IT.po
index 6a1ec2563..f07a453cd 100644
--- a/redbot/cogs/audio/locales/it-IT.po
+++ b/redbot/cogs/audio/locales/it-IT.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: it_IT\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/ja-JP.po b/redbot/cogs/audio/locales/ja-JP.po
index 7c3e07393..8403ae072 100644
--- a/redbot/cogs/audio/locales/ja-JP.po
+++ b/redbot/cogs/audio/locales/ja-JP.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,978 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: ja_JP\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr "音声チャンネルを介して音楽を再生します。"
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr "再生中:"
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr "長さ: {length} | {user} によって追加"
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr "{} つのサーバーで再生中"
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr "再生中:"
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr "長さ: {length} | {user} によって追加"
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr "キューを再生しきりました。"
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr "音声ファイルのエラー"
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr "スキップします..."
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr "音楽の再生に関する設定。"
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
-msgstr "DJ モードを切り替え"
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
+msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr "DJ モードに使用する役職を選択してください。名前またはIDが使用できます。"
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr "タイムアウトしました。もう一度試してみてください。"
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr "再生が終わった x 秒後に音声チャンネルから切断します。無効化するには 0 を指定してください。"
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr "0 以下を指定することはできません。"
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr "音声チャンネルに誰もいなくなっても、切断しないようになりました。"
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr "音声チャンネルから誰もいなくなった {num_seconds} 秒後に切断します。"
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr "DJ モードのために使用する役職を設定します。"
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr "DJ モードの役職として設定済み: {role.name}"
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr "役職を持っていないユーザーがキューに追加するためにかかるコストを設定できます。0 を指定すると無効化されます。"
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr "ジュークボックスモードを無効化します。"
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr "キューへ追加するコストを {price} {currency} に設定しました。"
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr "曲の通知やその他のメッセージを送信するかどうかを切り替えます。"
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr "通知モード: {true_or_false}"
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr "DJ モードのために使用する役職を設定します。"
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr "DJ モードの役職として設定済み: {role.name}"
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr "現在の設定を表示します。"
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr "サーバー設定"
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
-msgstr "切断タイマー: {num_seconds} 秒\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
-msgstr "DJ の役職: {role.name}\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
-msgstr "ジュークボックス: {jukebox_name}\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
-msgstr "コマンドのコスト: {jukebox_price}\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
-msgstr "リピート: {repeat}\n"
-"シャッフル再生: {shuffle}\n"
-"曲の通知: {notify}\n"
-"再生中の項目をステータスへ表示: {status}\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
-msgstr "サムネイル: {0}\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
-msgstr "投票によるスキップ: {vote_enabled}\n"
-"スキップが承認される割合: {vote_percent}%\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
-msgstr "--- Lavalink の設定 ---\n"
-"Cog のバージョン: {version}\n"
-"Jar のビルド: {jarbuild}\n"
-"外部のサーバー: {use_external_lavalink}"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
+msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
-msgstr "サムネイルを表示するかどうかを切り替えます。"
-
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
-msgstr "サムネイルを表示: {true_or_false}"
-
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr "サムネイルを表示するかどうかを切り替えます。"
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr "サムネイルを表示: {true_or_false}"
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/ko-KR.po b/redbot/cogs/audio/locales/ko-KR.po
index 89be8ca55..b6589a965 100644
--- a/redbot/cogs/audio/locales/ko-KR.po
+++ b/redbot/cogs/audio/locales/ko-KR.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:07\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:13\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: Korean\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: ko_KR\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr "음악 구성 옵션들이에요."
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr "자동으로 연결을 끊기는 모든 사용자 연결이 끊어진 후 x 초 후에 음악을 중지해요. 0 이면 자동으로 연결을 끊는 걸 비활성화해요"
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr "현재 설정을 표시할게요."
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search to search the queue.\n"
-" "
+msgid "List the songs in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1514 redbot/cogs/audio/audio.py:1517
-#: redbot/cogs/audio/audio.py:1544 redbot/cogs/audio/audio.py:2221
-#: redbot/cogs/audio/audio.py:2225 redbot/cogs/audio/audio.py:2232
-msgid "There's nothing in the queue."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1553
+#: redbot/cogs/audio/audio.py:2622
msgid "**Currently livestreaming:**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1559 redbot/cogs/audio/audio.py:1569
-#: redbot/cogs/audio/audio.py:1575
+#: redbot/cogs/audio/audio.py:2628 redbot/cogs/audio/audio.py:2638
+#: redbot/cogs/audio/audio.py:2644
msgid "Playing: "
msgstr ""
-#: redbot/cogs/audio/audio.py:1562 redbot/cogs/audio/audio.py:1570
-msgid "Requested by: **{user}**\n"
+#: redbot/cogs/audio/audio.py:2631
+msgid "Requested by: **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1577
+#: redbot/cogs/audio/audio.py:2639
+msgid "Requested by: **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2646
msgid "Requested by: **{user}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:1595 redbot/cogs/audio/audio.py:1599
-#: redbot/cogs/audio/audio.py:1604
-msgid "requested by **{user}**\n"
+#: redbot/cogs/audio/audio.py:2664
+msgid "requested by **{user}**\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1615
+#: redbot/cogs/audio/audio.py:2668
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2673
+msgid "requested by **{user}**\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2684
msgid "Page {page_num}/{total_pages} | {num_tracks} tracks, {num_remaining} remaining"
msgstr ""
-#: redbot/cogs/audio/audio.py:1624
+#: redbot/cogs/audio/audio.py:2693
msgid "Repeat"
msgstr ""
-#: redbot/cogs/audio/audio.py:1626
+#: redbot/cogs/audio/audio.py:2695
msgid "Shuffle"
msgstr ""
-#: redbot/cogs/audio/audio.py:1683
+#: redbot/cogs/audio/audio.py:2740
msgid "Matching Tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1686 redbot/cogs/audio/audio.py:2010
+#: redbot/cogs/audio/audio.py:2743 redbot/cogs/audio/audio.py:3182
msgid "Page {page_num}/{total_pages}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1695
+#: redbot/cogs/audio/audio.py:2752
+#, docstring
+msgid "Clears the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2764
+msgid "You need the DJ role to clear the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2766
+msgid "The queue has been cleared."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2771
+#, docstring
+msgid "Removes songs from the queue if the requester is not in the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2783
+msgid "You need the DJ role to clean the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2794
+msgid "Removed 0 tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2798
+msgid "Removed {removed_tracks} tracks queued by members outside of the voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2806
+#, docstring
+msgid "Search the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2829
#, docstring
msgid "Toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1701
+#: redbot/cogs/audio/audio.py:2835
msgid "You need the DJ role to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1712
+#: redbot/cogs/audio/audio.py:2843
msgid "You must be in the voice channel to toggle repeat."
msgstr ""
-#: redbot/cogs/audio/audio.py:1715
+#: redbot/cogs/audio/audio.py:2849
msgid "Repeat tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1721
+#: redbot/cogs/audio/audio.py:2857
#, docstring
msgid "Remove a specific track number from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1727
+#: redbot/cogs/audio/audio.py:2863
msgid "Nothing queued."
msgstr ""
-#: redbot/cogs/audio/audio.py:1730
+#: redbot/cogs/audio/audio.py:2866
msgid "You need the DJ role to remove tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1735
+#: redbot/cogs/audio/audio.py:2871
msgid "You must be in the voice channel to manage the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1751
+#: redbot/cogs/audio/audio.py:2887
msgid "Removed {track} from the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1757
+#: redbot/cogs/audio/audio.py:2894
#, docstring
-msgid "Pick a track with a search.\n\n"
-" Use `[p]search list ` to queue all tracks found\n"
-" on YouTube. `[p]search sc ` will search SoundCloud\n"
-" instead of YouTube.\n"
-" "
+msgid "Pick a track with a search.\\n\\n Use `[p]search list ` to queue all tracks found\\n on YouTube. `[p]search sc ` will search SoundCloud\\n instead of YouTube.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1814
+#: redbot/cogs/audio/audio.py:2958
msgid "You must be in the voice channel to enqueue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1831
-msgid "Queued {num} track(s)."
+#: redbot/cogs/audio/audio.py:2997
+msgid "Queued {num} track(s).{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1837
+#: redbot/cogs/audio/audio.py:3003
msgid "{time} until start of search playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:1997
+#: redbot/cogs/audio/audio.py:3169
msgid "Tracks Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1998
+#: redbot/cogs/audio/audio.py:3170
msgid "search results"
msgstr ""
-#: redbot/cogs/audio/audio.py:2001
+#: redbot/cogs/audio/audio.py:3173
msgid "Folders Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2002
+#: redbot/cogs/audio/audio.py:3174
msgid "local folders"
msgstr ""
-#: redbot/cogs/audio/audio.py:2004
+#: redbot/cogs/audio/audio.py:3176
msgid "Files Found:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2005
+#: redbot/cogs/audio/audio.py:3177
msgid "local tracks"
msgstr ""
-#: redbot/cogs/audio/audio.py:2022
+#: redbot/cogs/audio/audio.py:3195
#, docstring
-msgid "Seek ahead or behind on a track by seconds."
+msgid "Seek ahead or behind on a track by seconds or a to a specific time.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`)."
msgstr ""
-#: redbot/cogs/audio/audio.py:2031
+#: redbot/cogs/audio/audio.py:3206
msgid "You must be in the voice channel to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2036
+#: redbot/cogs/audio/audio.py:3211
msgid "You need the DJ role to use seek."
msgstr ""
-#: redbot/cogs/audio/audio.py:2042 redbot/cogs/audio/audio.py:2278
+#: redbot/cogs/audio/audio.py:3217 redbot/cogs/audio/audio.py:3510
msgid "There are other people listening - vote to skip instead."
msgstr ""
-#: redbot/cogs/audio/audio.py:2046
+#: redbot/cogs/audio/audio.py:3221
msgid "Can't seek on a stream."
msgstr ""
-#: redbot/cogs/audio/audio.py:2052
+#: redbot/cogs/audio/audio.py:3230
+msgid "Invalid input for the time to seek."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3236
msgid "Moved {num_seconds}s to 00:00:00"
msgstr ""
-#: redbot/cogs/audio/audio.py:2057
+#: redbot/cogs/audio/audio.py:3241
msgid "Moved {num_seconds}s to {time}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2068
+#: redbot/cogs/audio/audio.py:3249
+msgid "Moved to {time}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3261
#, docstring
msgid "Toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2072
+#: redbot/cogs/audio/audio.py:3265
msgid "You need the DJ role to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2083
+#: redbot/cogs/audio/audio.py:3273
msgid "You must be in the voice channel to toggle shuffle."
msgstr ""
-#: redbot/cogs/audio/audio.py:2086
+#: redbot/cogs/audio/audio.py:3279
msgid "Shuffle tracks: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2092
+#: redbot/cogs/audio/audio.py:3287
#, docstring
-msgid "Make Red sing one of her songs"
+msgid "Make Red sing one of her songs."
msgstr ""
-#: redbot/cogs/audio/audio.py:2107
+#: redbot/cogs/audio/audio.py:3303
#, docstring
-msgid "Skip to the next track."
+msgid "Skip to the next track, or to a given track number."
msgstr ""
-#: redbot/cogs/audio/audio.py:2126
+#: redbot/cogs/audio/audio.py:3322
+msgid "Can't skip to a specific track in vote mode without the DJ role."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3326
msgid "I removed your vote to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2129
+#: redbot/cogs/audio/audio.py:3329
msgid "You voted to skip."
msgstr ""
-#: redbot/cogs/audio/audio.py:2142
+#: redbot/cogs/audio/audio.py:3342
msgid "Vote threshold met."
msgstr ""
-#: redbot/cogs/audio/audio.py:2145
+#: redbot/cogs/audio/audio.py:3345
msgid " Votes: {num_votes}/{num_members} ({cur_percent}% out of {required_percent}% needed)"
msgstr ""
-#: redbot/cogs/audio/audio.py:2228
+#: redbot/cogs/audio/audio.py:3425
msgid "Currently livestreaming {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2235
+#: redbot/cogs/audio/audio.py:3432
msgid "{time} left on {track}"
msgstr ""
-#: redbot/cogs/audio/audio.py:2253
+#: redbot/cogs/audio/audio.py:3441
+msgid "Track number must be equal to or greater than 1."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3454
+msgid "Can't skip to a track while shuffle is enabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3470
msgid "Track Skipped"
msgstr ""
-#: redbot/cogs/audio/audio.py:2261
+#: redbot/cogs/audio/audio.py:3493
#, docstring
msgid "Stop playback and clear the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:2271
+#: redbot/cogs/audio/audio.py:3503
msgid "You must be in the voice channel to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2282
+#: redbot/cogs/audio/audio.py:3514
msgid "You need the DJ role to stop the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:2284
+#: redbot/cogs/audio/audio.py:3516
msgid "Stopping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:2294
+#: redbot/cogs/audio/audio.py:3531
+#, docstring
+msgid "Summon the bot to a voice channel."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3535
+msgid "You need the DJ role to summon the bot."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:3565
#, docstring
msgid "Set the volume, 1% - 150%."
msgstr ""
-#: redbot/cogs/audio/audio.py:2300
+#: redbot/cogs/audio/audio.py:3571
msgid "Current Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2312
+#: redbot/cogs/audio/audio.py:3583
msgid "You must be in the voice channel to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2318
+#: redbot/cogs/audio/audio.py:3589
msgid "You need the DJ role to change the volume."
msgstr ""
-#: redbot/cogs/audio/audio.py:2331
+#: redbot/cogs/audio/audio.py:3602
msgid "Volume:"
msgstr ""
-#: redbot/cogs/audio/audio.py:2341
+#: redbot/cogs/audio/audio.py:3613
#, docstring
msgid "Lavalink server configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:2346
+#: redbot/cogs/audio/audio.py:3618
#, docstring
msgid "Toggle using external lavalink servers."
msgstr ""
-#: redbot/cogs/audio/audio.py:2357 redbot/cogs/audio/audio.py:2366
+#: redbot/cogs/audio/audio.py:3625 redbot/cogs/audio/audio.py:3635
msgid "External lavalink server: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2361
-msgid "Defaults reset."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:2373
+#: redbot/cogs/audio/audio.py:3642
#, docstring
msgid "Set the lavalink server host."
msgstr ""
-#: redbot/cogs/audio/audio.py:2377 redbot/cogs/audio/audio.py:2382
+#: redbot/cogs/audio/audio.py:3646 redbot/cogs/audio/audio.py:3651
msgid "Host set to {host}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2379 redbot/cogs/audio/audio.py:2395
-#: redbot/cogs/audio/audio.py:2413 redbot/cogs/audio/audio.py:2429
+#: redbot/cogs/audio/audio.py:3648 redbot/cogs/audio/audio.py:3664
+#: redbot/cogs/audio/audio.py:3682 redbot/cogs/audio/audio.py:3698
msgid "External lavalink server set to True."
msgstr ""
-#: redbot/cogs/audio/audio.py:2388
+#: redbot/cogs/audio/audio.py:3657
#, docstring
msgid "Set the lavalink server password."
msgstr ""
-#: redbot/cogs/audio/audio.py:2393 redbot/cogs/audio/audio.py:2399
+#: redbot/cogs/audio/audio.py:3662 redbot/cogs/audio/audio.py:3668
msgid "Server password set to {password}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2406
+#: redbot/cogs/audio/audio.py:3675
#, docstring
msgid "Set the lavalink REST server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2411 redbot/cogs/audio/audio.py:2416
+#: redbot/cogs/audio/audio.py:3680 redbot/cogs/audio/audio.py:3685
msgid "REST port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2422
+#: redbot/cogs/audio/audio.py:3691
#, docstring
msgid "Set the lavalink websocket server port."
msgstr ""
-#: redbot/cogs/audio/audio.py:2427 redbot/cogs/audio/audio.py:2432
+#: redbot/cogs/audio/audio.py:3696 redbot/cogs/audio/audio.py:3701
msgid "Websocket port set to {port}."
msgstr ""
-#: redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:3801
msgid "Not enough {currency} ({required_credits} required)."
msgstr ""
diff --git a/redbot/cogs/audio/locales/lol-US.po b/redbot/cogs/audio/locales/lol-US.po
index a9165b4de..6534eb353 100644
--- a/redbot/cogs/audio/locales/lol-US.po
+++ b/redbot/cogs/audio/locales/lol-US.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
-"POT-Creation-Date: 2019-02-17 02:24+0000\n"
-"PO-Revision-Date: 2019-02-25 03:08\n"
-"Last-Translator: Kowlin \n"
+"POT-Creation-Date: 2019-07-05 22:33+0200\n"
+"PO-Revision-Date: 2019-07-06 16:14\n"
+"Last-Translator: Robert Jansen (Kowlin)\n"
"Language-Team: LOLCAT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: redgettext 2.2\n"
+"Generated-By: redgettext 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: red-discordbot\n"
@@ -16,971 +16,1275 @@ msgstr ""
"X-Crowdin-File: /cogs/audio/locales/messages.pot\n"
"Language: lol_US\n"
-#: redbot/cogs/audio/audio.py:38
+#: redbot/cogs/audio/audio.py:47
#, docstring
msgid "Play audio through voice channels."
msgstr ""
-#: redbot/cogs/audio/audio.py:173 redbot/cogs/audio/audio.py:735
-msgid "Now Playing"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:177
-msgid "Track length: {length} | Requested by: {user}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:201 redbot/cogs/audio/audio.py:227
+#: redbot/cogs/audio/audio.py:260
msgid "music in {} servers"
msgstr ""
-#: redbot/cogs/audio/audio.py:211
+#: redbot/cogs/audio/audio.py:300 redbot/cogs/audio/audio.py:1317
+msgid "Now Playing"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:304
+msgid "Track length: {length} | Requested by: {user}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:331
msgid "Queue ended."
msgstr ""
-#: redbot/cogs/audio/audio.py:240
+#: redbot/cogs/audio/audio.py:350
msgid "Track Error"
msgstr ""
-#: redbot/cogs/audio/audio.py:245
+#: redbot/cogs/audio/audio.py:355
msgid "Skipping..."
msgstr ""
-#: redbot/cogs/audio/audio.py:252
+#: redbot/cogs/audio/audio.py:363
#, docstring
msgid "Music configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:258
+#: redbot/cogs/audio/audio.py:369
#, docstring
-msgid "Toggle DJ mode.\n\n"
-" DJ mode allows users with the DJ role to use audio commands.\n"
-" "
+msgid "Toggle the bot auto-disconnecting when done playing.\\n\\n This setting takes precedence over [p]audioset emptydisconnect.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:265
+#: redbot/cogs/audio/audio.py:377
+msgid "Auto-disconnection at queue end: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:385
+#, docstring
+msgid "Toggle DJ mode.\\n\\n DJ mode allows users with the DJ role to use audio commands.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:392
msgid "Please set a role to use with DJ mode. Enter the role name or ID now."
msgstr ""
-#: redbot/cogs/audio/audio.py:273
+#: redbot/cogs/audio/audio.py:400
msgid "Response timed out, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:284
+#: redbot/cogs/audio/audio.py:405
+msgid "DJ role enabled: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:411
#, docstring
msgid "Auto-disconnection after x seconds while stopped. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:286 redbot/cogs/audio/audio.py:317
-#: redbot/cogs/audio/audio.py:405
+#: redbot/cogs/audio/audio.py:413 redbot/cogs/audio/audio.py:436
+#: redbot/cogs/audio/audio.py:543 redbot/cogs/audio/audio.py:687
msgid "Can't be less than zero."
msgstr ""
-#: redbot/cogs/audio/audio.py:291
+#: redbot/cogs/audio/audio.py:418
msgid "Empty disconnect disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:296
+#: redbot/cogs/audio/audio.py:423
msgid "Empty disconnect timer set to {num_seconds}."
msgstr ""
-#: redbot/cogs/audio/audio.py:307
-#, docstring
-msgid "Set the role to use for DJ mode."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:310
-msgid "DJ role set to: {role.name}."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:315
+#: redbot/cogs/audio/audio.py:434
#, docstring
msgid "Set a price for queueing tracks for non-mods. 0 to disable."
msgstr ""
-#: redbot/cogs/audio/audio.py:320
+#: redbot/cogs/audio/audio.py:439
msgid "Jukebox mode disabled."
msgstr ""
-#: redbot/cogs/audio/audio.py:325
+#: redbot/cogs/audio/audio.py:444
msgid "Track queueing command price set to {price} {currency}."
msgstr ""
-#: redbot/cogs/audio/audio.py:336
+#: redbot/cogs/audio/audio.py:455
+#, docstring
+msgid "Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.\\n\\n Leave the path blank to reset the path to the default, the Audio data directory.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:463
+msgid "The localtracks path location has been reset to the default location."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:466
+msgid "This setting is only for bot owners to set a localtracks folder location if the Lavalink.jar is being ran from outside of the Audio data directory.\\nIn the example below, the full path for 'ParentDirectory' must be passed to this command.\\nThe path must not contain spaces.\\n```\\nParentDirectory\\n |__ localtracks (folder)\\n | |__ Awesome Album Name (folder)\\n | |__01 Cool Song.mp3\\n | |__02 Groovy Song.mp3\\n |\\n |__ Lavalink.jar\\n |__ application.yml\\n```\\nThe folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\\nUse this command with no path given to reset it to the default, the Audio data directory for this bot.\\nDo you want to continue to set the provided path for local tracks?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:505
+msgid "{local_path} does not seem like a valid path."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:520
+msgid "The path that was entered does not have {filelist} file in that location. The path will still be saved, but please check the path and the file location before attempting to play local tracks or start your Lavalink.jar."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:530
+msgid "Localtracks path set to: {local_path}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:536
+#, docstring
+msgid "Max length of a track to queue in seconds. 0 to disable.\\n\\n Accepts seconds or a value formatted like 00:00:00 (`hh:mm:ss`) or 00:00 (`mm:ss`).\\n Invalid input will turn the max length setting off."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:545
+msgid "Track max length disabled."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:549
+msgid "Track max length set to {seconds}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:559
#, docstring
msgid "Toggle track announcement and other bot messages."
msgstr ""
-#: redbot/cogs/audio/audio.py:340
+#: redbot/cogs/audio/audio.py:563
msgid "Verbose mode on: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:345
+#: redbot/cogs/audio/audio.py:569
+#, docstring
+msgid "Toggle the domain restriction on Audio.\\n\\n When toggled off, users will be able to play songs from non-commercial websites and links.\\n When toggled on, users are restricted to YouTube, SoundCloud, Mixer, Vimeo, Twitch, and Bandcamp links."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:576
+msgid "Commercial links only: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:582
+#, docstring
+msgid "Set the role to use for DJ mode."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:585
+msgid "DJ role set to: {role.name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:589
#, docstring
msgid "Show the current settings."
msgstr ""
-#: redbot/cogs/audio/audio.py:358
+#: redbot/cogs/audio/audio.py:604
msgid "Server Settings"
msgstr ""
-#: redbot/cogs/audio/audio.py:360
-msgid "Disconnect timer: [{num_seconds}]\n"
+#: redbot/cogs/audio/audio.py:606
+msgid "Auto-disconnect: [{dc}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:364
-msgid "DJ Role: [{role.name}]\n"
+#: redbot/cogs/audio/audio.py:609
+msgid "Disconnect timer: [{num_seconds}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:366
-msgid "Jukebox: [{jukebox_name}]\n"
+#: redbot/cogs/audio/audio.py:613
+msgid "DJ Role: [{role.name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:367
-msgid "Command price: [{jukebox_price}]\n"
+#: redbot/cogs/audio/audio.py:615
+msgid "Jukebox: [{jukebox_name}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:368
-msgid "Repeat: [{repeat}]\n"
-"Shuffle: [{shuffle}]\n"
-"Song notify msgs: [{notify}]\n"
-"Songs as status: [{status}]\n"
+#: redbot/cogs/audio/audio.py:616
+msgid "Command price: [{jukebox_price}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:375
-msgid "Thumbnails: [{0}]\n"
+#: redbot/cogs/audio/audio.py:618
+msgid "Max track length: [{tracklength}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:377
-msgid "Vote skip: [{vote_enabled}]\n"
-"Skip percentage: [{vote_percent}%]\n"
+#: redbot/cogs/audio/audio.py:621
+msgid "Repeat: [{repeat}]\\nShuffle: [{shuffle}]\\nSong notify msgs: [{notify}]\\nSongs as status: [{status}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:380
-msgid "---Lavalink Settings---\n"
-"Cog version: [{version}]\n"
-"Jar build: [{jarbuild}]\n"
-"External server: [{use_external_lavalink}]"
+#: redbot/cogs/audio/audio.py:628
+msgid "Thumbnails: [{0}]\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:393
+#: redbot/cogs/audio/audio.py:630
+msgid "Vote skip: [{vote_enabled}]\\nSkip percentage: [{vote_percent}%]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:633
+msgid "---Lavalink Settings--- \\nCog version: [{version}]\\nJar build: [{jarbuild}]\\nExternal server: [{use_external_lavalink}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:640
+msgid "Localtracks path: [{localpath}]\\n"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:648
#, docstring
-msgid "Toggle displaying a thumbnail on audio messages."
+msgid "Instructions to set the Spotify API tokens."
msgstr ""
-#: redbot/cogs/audio/audio.py:397
-msgid "Thumbnail display: {true_or_false}."
+#: redbot/cogs/audio/audio.py:649
+msgid "1. Go to Spotify developers and log in with your Spotify account.\\n(https://developer.spotify.com/dashboard/applications)\\n2. Click \\\"Create An App\\\".\\n3. Fill out the form provided with your app name, etc.\\n4. When asked if you're developing commercial integration select \\\"No\\\".\\n5. Accept the terms and conditions.\\n6. Copy your client ID and your client secret into:\\n`{prefix}set api spotify client_id, client_secret,`"
msgstr ""
-#: redbot/cogs/audio/audio.py:403
-#, docstring
-msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:411
-msgid "Voting disabled. All users can use queue management commands."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:416
-msgid "Vote percentage set to {percent}%."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:425
+#: redbot/cogs/audio/audio.py:665
#, docstring
msgid "Enable/disable tracks' titles as status."
msgstr ""
-#: redbot/cogs/audio/audio.py:429
+#: redbot/cogs/audio/audio.py:669
msgid "Song titles as status: {true_or_false}."
msgstr ""
-#: redbot/cogs/audio/audio.py:435
+#: redbot/cogs/audio/audio.py:675
+#, docstring
+msgid "Toggle displaying a thumbnail on audio messages."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:679
+msgid "Thumbnail display: {true_or_false}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:685
+#, docstring
+msgid "Percentage needed for non-mods to skip tracks. 0 to disable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:693
+msgid "Voting disabled. All users can use queue management commands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:698
+msgid "Vote percentage set to {percent}%."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:707
+#, docstring
+msgid "Instructions to set the YouTube API key."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:726
#, docstring
msgid "Audio stats."
msgstr ""
-#: redbot/cogs/audio/audio.py:469 redbot/cogs/audio/audio.py:489
-#: redbot/cogs/audio/audio.py:698 redbot/cogs/audio/audio.py:788
-#: redbot/cogs/audio/audio.py:804 redbot/cogs/audio/audio.py:829
-#: redbot/cogs/audio/audio.py:836 redbot/cogs/audio/audio.py:1179
-#: redbot/cogs/audio/audio.py:1466 redbot/cogs/audio/audio.py:1724
-#: redbot/cogs/audio/audio.py:2026 redbot/cogs/audio/audio.py:2063
-#: redbot/cogs/audio/audio.py:2109 redbot/cogs/audio/audio.py:2265
-#: redbot/cogs/audio/audio.py:2304 redbot/cogs/audio/audio.py:2334
+#: redbot/cogs/audio/audio.py:754 redbot/cogs/audio/audio.py:782
+#: redbot/cogs/audio/audio.py:819 redbot/cogs/audio/audio.py:847
+#: redbot/cogs/audio/audio.py:914 redbot/cogs/audio/audio.py:932
+#: redbot/cogs/audio/audio.py:956 redbot/cogs/audio/audio.py:1026
+#: redbot/cogs/audio/audio.py:1280 redbot/cogs/audio/audio.py:1371
+#: redbot/cogs/audio/audio.py:1388 redbot/cogs/audio/audio.py:1411
+#: redbot/cogs/audio/audio.py:1419 redbot/cogs/audio/audio.py:2190
+#: redbot/cogs/audio/audio.py:2527 redbot/cogs/audio/audio.py:2860
+#: redbot/cogs/audio/audio.py:3201 redbot/cogs/audio/audio.py:3255
+#: redbot/cogs/audio/audio.py:3305 redbot/cogs/audio/audio.py:3497
+#: redbot/cogs/audio/audio.py:3575 redbot/cogs/audio/audio.py:3605
msgid "Nothing playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:473
+#: redbot/cogs/audio/audio.py:758
msgid "Not connected anywhere."
msgstr ""
-#: redbot/cogs/audio/audio.py:478
-msgid "Connected in {num} servers:"
+#: redbot/cogs/audio/audio.py:764
+msgid "Playing in {num}/{total} servers:"
msgstr ""
-#: redbot/cogs/audio/audio.py:486
+#: redbot/cogs/audio/audio.py:779
#, docstring
msgid "Bump a track number to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:495
+#: redbot/cogs/audio/audio.py:788
msgid "You must be in the voice channel to bump a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:499
+#: redbot/cogs/audio/audio.py:792
msgid "You need the DJ role to bump tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:502 redbot/cogs/audio/audio.py:1739
+#: redbot/cogs/audio/audio.py:795 redbot/cogs/audio/audio.py:2875
msgid "Song number must be greater than 1 and within the queue limit."
msgstr ""
-#: redbot/cogs/audio/audio.py:517
+#: redbot/cogs/audio/audio.py:810
msgid "Moved {track} to the top of the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:523
+#: redbot/cogs/audio/audio.py:817
#, docstring
msgid "Disconnect from the voice channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:528
+#: redbot/cogs/audio/audio.py:826
msgid "You need the DJ role to disconnect."
msgstr ""
-#: redbot/cogs/audio/audio.py:532
+#: redbot/cogs/audio/audio.py:830
msgid "There are other people listening to music."
msgstr ""
-#: redbot/cogs/audio/audio.py:540
+#: redbot/cogs/audio/audio.py:845
+#, docstring
+msgid "Equalizer management."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:865
+#, docstring
+msgid "Delete a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:887
+#, docstring
+msgid "List saved eq presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:890
+msgid "No saved equalizer presets."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:897
+msgid "{num} preset(s)"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:903
+#, docstring
+msgid "Load a saved eq preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:930
+#, docstring
+msgid "Reset the eq to 0 across all bands."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:946
+msgid "Equalizer values have been reset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:954
+#, docstring
+msgid "Save the current eq settings to a preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:958
+msgid "Please enter a name for this equalizer preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:972
+msgid "No equalizer preset name entered, try the command again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:981 redbot/cogs/audio/audio.py:2213
+msgid "Try the command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:985
+msgid "Preset name already exists, do you want to replace it?"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:994
+msgid "Not saving preset."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1019
+#, docstring
+msgid "Set an eq band with a band number or name and value.\\n\\n Band positions are 1-15 and values have a range of -0.25 to 1.0.\\n Band names are 25, 40, 63, 100, 160, 250, 400, 630, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, and 16k Hz.\\n Setting a band value to -0.25 nullifies it while +0.25 is double.\\n "
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1063
+msgid "Valid band numbers are 1-15 or the band names listed in the help for this command."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1099
#, docstring
msgid "Local playback commands."
msgstr ""
-#: redbot/cogs/audio/audio.py:545
+#: redbot/cogs/audio/audio.py:1104
#, docstring
msgid "Play all songs in a localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:552
+#: redbot/cogs/audio/audio.py:1115
+msgid "No localtracks folder named {name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1121
#, docstring
msgid "Play a local track."
msgstr ""
-#: redbot/cogs/audio/audio.py:557
+#: redbot/cogs/audio/audio.py:1126
msgid "No local track folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:600
+#: redbot/cogs/audio/audio.py:1169
#, docstring
msgid "Search for songs across all localtracks folders."
msgstr ""
-#: redbot/cogs/audio/audio.py:605
+#: redbot/cogs/audio/audio.py:1174
msgid "No album folders found."
msgstr ""
-#: redbot/cogs/audio/audio.py:612 redbot/cogs/audio/audio.py:1634
+#: redbot/cogs/audio/audio.py:1181 redbot/cogs/audio/audio.py:2816
msgid "No matches."
msgstr ""
-#: redbot/cogs/audio/audio.py:688
+#: redbot/cogs/audio/audio.py:1269
msgid "No localtracks folder."
msgstr ""
-#: redbot/cogs/audio/audio.py:696
+#: redbot/cogs/audio/audio.py:1278
#, docstring
msgid "Now playing."
msgstr ""
-#: redbot/cogs/audio/audio.py:716
+#: redbot/cogs/audio/audio.py:1298
msgid "Requested by: **{track.requester}**"
msgstr ""
-#: redbot/cogs/audio/audio.py:726
+#: redbot/cogs/audio/audio.py:1308
msgid "Nothing."
msgstr ""
-#: redbot/cogs/audio/audio.py:785
+#: redbot/cogs/audio/audio.py:1368
#, docstring
-msgid "Pause and resume."
+msgid "Pause or resume a playing track."
msgstr ""
-#: redbot/cogs/audio/audio.py:794
-msgid "You must be in the voice channel to pause the music."
+#: redbot/cogs/audio/audio.py:1377
+msgid "You must be in the voice channel pause or resume."
msgstr ""
-#: redbot/cogs/audio/audio.py:800
-msgid "You need the DJ role to pause tracks."
+#: redbot/cogs/audio/audio.py:1384
+msgid "You need the DJ role to pause or resume tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:814
+#: redbot/cogs/audio/audio.py:1401
msgid "Track Paused"
msgstr ""
-#: redbot/cogs/audio/audio.py:821
+#: redbot/cogs/audio/audio.py:1407
msgid "Track Resumed"
msgstr ""
-#: redbot/cogs/audio/audio.py:826
-msgid "Track is paused."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:828
-msgid "Track is playing."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:834
+#: redbot/cogs/audio/audio.py:1417
#, docstring
msgid "Queue percentage."
msgstr ""
-#: redbot/cogs/audio/audio.py:860
+#: redbot/cogs/audio/audio.py:1443
msgid "Nothing in the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:882
+#: redbot/cogs/audio/audio.py:1465
msgid "Queued and playing tracks:"
msgstr ""
-#: redbot/cogs/audio/audio.py:890
+#: redbot/cogs/audio/audio.py:1474
#, docstring
msgid "Play a URL or search for a track."
msgstr ""
-#: redbot/cogs/audio/audio.py:900 redbot/cogs/audio/audio.py:1411
-#: redbot/cogs/audio/audio.py:1795
+#: redbot/cogs/audio/audio.py:1481
+msgid "That URL is not allowed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1484 redbot/cogs/audio/audio.py:2437
+#: redbot/cogs/audio/audio.py:2928 redbot/cogs/audio/audio.py:3047
+msgid "Connection to Lavalink has failed."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1486 redbot/cogs/audio/audio.py:2439
+#: redbot/cogs/audio/audio.py:2930 redbot/cogs/audio/audio.py:3049
+msgid "Please check your console or logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1495 redbot/cogs/audio/audio.py:2449
+#: redbot/cogs/audio/audio.py:2939 redbot/cogs/audio/audio.py:3543
msgid "I don't have permission to connect to your channel."
msgstr ""
-#: redbot/cogs/audio/audio.py:906 redbot/cogs/audio/audio.py:1422
-#: redbot/cogs/audio/audio.py:1801 redbot/cogs/audio/audio.py:1889
+#: redbot/cogs/audio/audio.py:1501 redbot/cogs/audio/audio.py:2461
+#: redbot/cogs/audio/audio.py:2945 redbot/cogs/audio/audio.py:3056
+#: redbot/cogs/audio/audio.py:3555
msgid "Connect to a voice channel first."
msgstr ""
-#: redbot/cogs/audio/audio.py:909 redbot/cogs/audio/audio.py:1418
-#: redbot/cogs/audio/audio.py:1804 redbot/cogs/audio/audio.py:1892
+#: redbot/cogs/audio/audio.py:1504 redbot/cogs/audio/audio.py:2457
+#: redbot/cogs/audio/audio.py:2948 redbot/cogs/audio/audio.py:3059
+#: redbot/cogs/audio/audio.py:3558
msgid "Connection to Lavalink has not yet been established."
msgstr ""
-#: redbot/cogs/audio/audio.py:913
+#: redbot/cogs/audio/audio.py:1508
msgid "You need the DJ role to queue tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:922
+#: redbot/cogs/audio/audio.py:1519
msgid "You must be in the voice channel to use the play command."
msgstr ""
-#: redbot/cogs/audio/audio.py:928
+#: redbot/cogs/audio/audio.py:1525
msgid "No tracks to play."
msgstr ""
-#: redbot/cogs/audio/audio.py:942 redbot/cogs/audio/audio.py:1450
-#: redbot/cogs/audio/audio.py:1828 redbot/cogs/audio/audio.py:1865
+#: redbot/cogs/audio/audio.py:1565
+msgid "The owner needs to set the Spotify client ID, Spotify client secret, and YouTube API key before Spotify URLs or codes can be used. \\nSee `{prefix}audioset youtubeapi` and `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1575 redbot/cogs/audio/audio.py:2493
+msgid "Wait until the playlist has finished loading."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1592 redbot/cogs/audio/audio.py:1657
+#: redbot/cogs/audio/audio.py:2499 redbot/cogs/audio/audio.py:2509
+#: redbot/cogs/audio/audio.py:2973 redbot/cogs/audio/audio.py:3027
msgid "Nothing found."
msgstr ""
-#: redbot/cogs/audio/audio.py:953 redbot/cogs/audio/audio.py:1295
+#: redbot/cogs/audio/audio.py:1600
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1639 redbot/cogs/audio/audio.py:1776
+msgid "This doesn't seem to be a valid Spotify URL or code."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1688 redbot/cogs/audio/audio.py:2320
msgid "Playlist Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:954 redbot/cogs/audio/audio.py:1296
-msgid "Added {num} tracks to the queue."
+#: redbot/cogs/audio/audio.py:1689 redbot/cogs/audio/audio.py:2321
+msgid "Added {num} tracks to the queue.{maxlength_msg}"
msgstr ""
-#: redbot/cogs/audio/audio.py:958
+#: redbot/cogs/audio/audio.py:1695
msgid "{time} until start of playlist playback: starts at #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:980 redbot/cogs/audio/audio.py:1938
+#: redbot/cogs/audio/audio.py:1711 redbot/cogs/audio/audio.py:3125
+msgid "Track exceeds maximum length."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1717
+msgid "Nothing found. Check your Lavalink logs for details."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1732 redbot/cogs/audio/audio.py:3108
msgid "Track Enqueued"
msgstr ""
-#: redbot/cogs/audio/audio.py:984 redbot/cogs/audio/audio.py:1944
+#: redbot/cogs/audio/audio.py:1736 redbot/cogs/audio/audio.py:3114
msgid "{time} until track playback: #{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:989 redbot/cogs/audio/audio.py:1949
+#: redbot/cogs/audio/audio.py:1741 redbot/cogs/audio/audio.py:3119
msgid "#{position} in queue"
msgstr ""
-#: redbot/cogs/audio/audio.py:997
+#: redbot/cogs/audio/audio.py:1761
+msgid "The Spotify API key or client secret has not been set properly. \\nUse `{prefix}audioset spotifyapi` for instructions."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1793 redbot/cogs/audio/audio.py:2384
+msgid "Please wait, adding tracks..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1809
+msgid "The connection was reset while loading the playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1826 redbot/cogs/audio/audio.py:2401
+msgid "Loading track {num}/{total}..."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1840
+msgid "Approximate time remaining: {seconds}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1850
+msgid "Nothing found.\\nThe YouTube API key may be invalid or you may be rate limited on YouTube's search service.\\nCheck the YouTube API key again and follow the instructions at `{prefix}audioset youtubeapi`."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1871
#, docstring
msgid "Playlist configuration options."
msgstr ""
-#: redbot/cogs/audio/audio.py:1002
+#: redbot/cogs/audio/audio.py:1876
#, docstring
-msgid "Add a track URL, playlist link, or quick search to a playlist.\n\n"
-" The track(s) will be appended to the end of the playlist.\n"
-" "
+msgid "Add a track URL, playlist link, or quick search to a playlist.\\n\\n The track(s) will be appended to the end of the playlist.\\n "
msgstr ""
-#: redbot/cogs/audio/audio.py:1014 redbot/cogs/audio/audio.py:1078
-#: redbot/cogs/audio/audio.py:1228
+#: redbot/cogs/audio/audio.py:1888 redbot/cogs/audio/audio.py:2028
+#: redbot/cogs/audio/audio.py:2241
msgid "You are not the author of that playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1024
+#: redbot/cogs/audio/audio.py:1898
msgid "{track} is already in {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1033 redbot/cogs/audio/audio.py:1082
-#: redbot/cogs/audio/audio.py:1092 redbot/cogs/audio/audio.py:1231
+#: redbot/cogs/audio/audio.py:1907 redbot/cogs/audio/audio.py:2032
+#: redbot/cogs/audio/audio.py:2081 redbot/cogs/audio/audio.py:2244
msgid "No playlist with that name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1040
+#: redbot/cogs/audio/audio.py:1914
msgid "{track} appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1046
+#: redbot/cogs/audio/audio.py:1920
msgid "{num} tracks appended to {playlist}."
msgstr ""
-#: redbot/cogs/audio/audio.py:1053
+#: redbot/cogs/audio/audio.py:1928
+#, docstring
+msgid "Copy a playlist from one server to another."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1932
+msgid "Invalid server ID for source server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1934
+msgid "Invalid server ID for target server."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1939
+msgid "No playlist with that name in {from_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1950
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1962
+msgid "A playlist with that name already exists in {to_guild_name}.\\nPlease enter a new name for this playlist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1975
+msgid "Try the playlist copy command again with a shorter name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1980
+msgid "Playlist name already exists in {to_guild_name}, try the playlist copy command again with a different name."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1986 redbot/cogs/audio/audio.py:2220
+msgid "No playlist name entered, try again later."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:1991
+msgid "Playlist {name} copied from {from_guild_name} to {to_guild_name}.\\nNew playlist name on {to_guild_name}: {new_name}"
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2003
#, docstring
msgid "Create an empty playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1057 redbot/cogs/audio/audio.py:1172
+#: redbot/cogs/audio/audio.py:2007 redbot/cogs/audio/audio.py:2183
msgid "You need the DJ role to save playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1061 redbot/cogs/audio/audio.py:1176
-#: redbot/cogs/audio/audio.py:1204
+#: redbot/cogs/audio/audio.py:2011 redbot/cogs/audio/audio.py:2187
+#: redbot/cogs/audio/audio.py:2217
msgid "Playlist name already exists, try again with a different name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1067
+#: redbot/cogs/audio/audio.py:2017
msgid "Empty playlist {name} created."
msgstr ""
-#: redbot/cogs/audio/audio.py:1071
+#: redbot/cogs/audio/audio.py:2021
#, docstring
msgid "Delete a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1083
+#: redbot/cogs/audio/audio.py:2033
msgid "{name} playlist deleted."
msgstr ""
-#: redbot/cogs/audio/audio.py:1087
+#: redbot/cogs/audio/audio.py:2039
+#, docstring
+msgid "Download a copy of a playlist.\\n\\n These files can be used with the [p]playlist upload command.\\n Red v2-compatible playlists can be generated by passing True\\n for the v2 variable."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2061
+msgid "That playlist has no tracks."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2063 redbot/cogs/audio/audio.py:2331
+msgid "That playlist doesn't exist."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2076
#, docstring
msgid "Retrieve information from a saved playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1100
-msgid "**Custom playlist.**"
+#: redbot/cogs/audio/audio.py:2101
+msgid "Playlist info for {playlist_name}:\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1102
-msgid "URL: <{url}>"
+#: redbot/cogs/audio/audio.py:2105
+msgid "Playlist info for {playlist_name}:\\nURL: {url}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1105
-msgid "Playlist info for {playlist_name}:"
+#: redbot/cogs/audio/audio.py:2116
+msgid "Author: {author_name} | {num} track(s)"
msgstr ""
-#: redbot/cogs/audio/audio.py:1106
-msgid "Author: **{author_name}**\n"
-"{url}"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1110
-msgid "{num} track(s)"
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1115
+#: redbot/cogs/audio/audio.py:2126
#, docstring
msgid "List saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1118
+#: redbot/cogs/audio/audio.py:2129
msgid "No saved playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1130
+#: redbot/cogs/audio/audio.py:2141
msgid "Tracks: {num}"
msgstr ""
-#: redbot/cogs/audio/audio.py:1131
-msgid "Author: {name}\n"
+#: redbot/cogs/audio/audio.py:2142
+msgid "Author: {name}\\n"
msgstr ""
-#: redbot/cogs/audio/audio.py:1155
+#: redbot/cogs/audio/audio.py:2166
msgid "Playlists for {server_name}:"
msgstr ""
-#: redbot/cogs/audio/audio.py:1159
+#: redbot/cogs/audio/audio.py:2170
msgid "Page {page_num}/{total_pages} | {num} playlists"
msgstr ""
-#: redbot/cogs/audio/audio.py:1168
+#: redbot/cogs/audio/audio.py:2179
#, docstring
msgid "Save the queue to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1189
+#: redbot/cogs/audio/audio.py:2193 redbot/cogs/audio/audio.py:2590
+#: redbot/cogs/audio/audio.py:2593 redbot/cogs/audio/audio.py:2613
+#: redbot/cogs/audio/audio.py:2756 redbot/cogs/audio/audio.py:2759
+#: redbot/cogs/audio/audio.py:2775 redbot/cogs/audio/audio.py:2778
+#: redbot/cogs/audio/audio.py:2810 redbot/cogs/audio/audio.py:2812
+#: redbot/cogs/audio/audio.py:3418 redbot/cogs/audio/audio.py:3422
+#: redbot/cogs/audio/audio.py:3429
+msgid "There's nothing in the queue."
+msgstr ""
+
+#: redbot/cogs/audio/audio.py:2202
msgid "Please enter a name for this playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1200
-msgid "Try the command again with a shorter name."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1207
-msgid "No playlist name entered, try again later."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1214
+#: redbot/cogs/audio/audio.py:2227
msgid "Playlist {name} saved from current queue: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1221
+#: redbot/cogs/audio/audio.py:2234
#, docstring
msgid "Remove a track from a playlist by url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1235
+#: redbot/cogs/audio/audio.py:2248
msgid "URL not in playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1239
+#: redbot/cogs/audio/audio.py:2252
msgid "No tracks left, removing playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1246
+#: redbot/cogs/audio/audio.py:2259
msgid "{num} entries have been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1253
+#: redbot/cogs/audio/audio.py:2266
msgid "The track has been removed from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1260
+#: redbot/cogs/audio/audio.py:2273
#, docstring
msgid "Save a playlist from a url."
msgstr ""
-#: redbot/cogs/audio/audio.py:1272
+#: redbot/cogs/audio/audio.py:2285
msgid "Playlist {name} saved: {num} tracks added."
msgstr ""
-#: redbot/cogs/audio/audio.py:1279
+#: redbot/cogs/audio/audio.py:2292
#, docstring
msgid "Load a playlist into the queue."
msgstr ""
-#: redbot/cogs/audio/audio.py:1304
-msgid "That playlist doesn't exist."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1309
+#: redbot/cogs/audio/audio.py:2336
#, docstring
msgid "Convert a Red v2 playlist file to a playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1315
+#: redbot/cogs/audio/audio.py:2342
msgid "Please upload the playlist file. Any other message will cancel this operation."
msgstr ""
-#: redbot/cogs/audio/audio.py:1323
+#: redbot/cogs/audio/audio.py:2350
msgid "No file detected, try again later."
msgstr ""
-#: redbot/cogs/audio/audio.py:1327
+#: redbot/cogs/audio/audio.py:2354
msgid "Upload cancelled."
msgstr ""
-#: redbot/cogs/audio/audio.py:1331
+#: redbot/cogs/audio/audio.py:2358
msgid "Only playlist files can be uploaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1336
+#: redbot/cogs/audio/audio.py:2363
msgid "Not a valid playlist file."
msgstr ""
-#: redbot/cogs/audio/audio.py:1352
+#: redbot/cogs/audio/audio.py:2379
msgid "A playlist already exists with this name."
msgstr ""
-#: redbot/cogs/audio/audio.py:1357
-msgid "Please wait, adding tracks..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1371
-msgid "Loading track {num}/{total}..."
-msgstr ""
-
-#: redbot/cogs/audio/audio.py:1377
+#: redbot/cogs/audio/audio.py:2407
msgid "No tracks found."
msgstr ""
-#: redbot/cogs/audio/audio.py:1383
+#: redbot/cogs/audio/audio.py:2413
msgid "Added {num} tracks from the {playlist_name} playlist. {num_bad} track(s) could not be loaded."
msgstr ""
-#: redbot/cogs/audio/audio.py:1388
+#: redbot/cogs/audio/audio.py:2418
msgid "Added {num} tracks from the {playlist_name} playlist."
msgstr ""
-#: redbot/cogs/audio/audio.py:1392
+#: redbot/cogs/audio/audio.py:2422
msgid "Playlist Saved"
msgstr ""
-#: redbot/cogs/audio/audio.py:1403
+#: redbot/cogs/audio/audio.py:2433
msgid "You need the DJ role to use playlists."
msgstr ""
-#: redbot/cogs/audio/audio.py:1432
+#: redbot/cogs/audio/audio.py:2471
msgid "You must be in the voice channel to use the playlist command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1464
+#: redbot/cogs/audio/audio.py:2525
#, docstring
msgid "Skip to the start of the previously played track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1474 redbot/cogs/audio/audio.py:2121
+#: redbot/cogs/audio/audio.py:2535 redbot/cogs/audio/audio.py:3317
msgid "You need the DJ role to skip tracks."
msgstr ""
-#: redbot/cogs/audio/audio.py:1479 redbot/cogs/audio/audio.py:2115
+#: redbot/cogs/audio/audio.py:2540 redbot/cogs/audio/audio.py:3311
msgid "You must be in the voice channel to skip the music."
msgstr ""
-#: redbot/cogs/audio/audio.py:1482
+#: redbot/cogs/audio/audio.py:2543
msgid "Turn shuffle off to use this command."
msgstr ""
-#: redbot/cogs/audio/audio.py:1484
+#: redbot/cogs/audio/audio.py:2545
msgid "No previous track."
msgstr ""
-#: redbot/cogs/audio/audio.py:1501
+#: redbot/cogs/audio/audio.py:2562
msgid "Replaying Track"
msgstr ""
-#: redbot/cogs/audio/audio.py:1509
+#: redbot/cogs/audio/audio.py:2571
#, docstring
-msgid "List the queue.\n\n"
-" Use [p]queue search