diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 00f02354956..975aefbf5be 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -80,14 +80,43 @@ jobs: name: build-output path: ./dist + generate_default_ll_server_config: + name: Generate default application.yml + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install script's dependencies + run: python -m pip install PyYAML + + - name: Generate default application.yml + env: + APP_YML_FILE: "Red-DiscordBot-${{ github.ref_name }}-default-lavalink-application.yml" + run: | + mkdir -p release_assets + python .github/workflows/scripts/get_default_ll_server_config.py "release_assets/$APP_YML_FILE" + + - name: Upload default application.yml + uses: actions/upload-artifact@v3 + with: + name: ll-default-server-config + path: ./release_assets + release_to_pypi: needs: - release_information - build + - generate_default_ll_server_config environment: Release name: Release to PyPI runs-on: ubuntu-latest permissions: + contents: write id-token: write steps: - name: Download packaged distributions @@ -96,6 +125,18 @@ jobs: name: build-output path: dist/ + - name: Download default application.yml + uses: actions/download-artifact@v3 + with: + name: ll-default-server-config + path: release_assets/ + + - name: Upload dists to GitHub Release + env: + GITHUB_TOKEN: "${{ github.token }}" + run: | + gh release upload "$GITHUB_REF_NAME" dist/* release_assets/* --repo "$GITHUB_REPOSITORY" + - name: Publish package distributions to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: diff --git a/.github/workflows/scripts/get_default_ll_server_config.py b/.github/workflows/scripts/get_default_ll_server_config.py new file mode 100644 index 00000000000..c25020f3ebb --- /dev/null +++ b/.github/workflows/scripts/get_default_ll_server_config.py @@ -0,0 +1,31 @@ +import sys +from pathlib import Path + +import yaml + +ROOT_FOLDER = Path(__file__).parents[3].absolute() +AUDIO_FOLDER = ROOT_FOLDER / "redbot/cogs/audio" + +# We want to import `redbot.cogs.audio.managed_node` package as if it were top-level package +# so we have to the `redbot/cogs/audio` directory to Python's path. +sys.path.insert(0, str(AUDIO_FOLDER)) + + +def main() -> int: + try: + output_file = sys.argv[1] + except IndexError: + print("Usage:", sys.argv[0], "", file=sys.stderr) + return 2 + + import managed_node + + server_config = managed_node.get_default_server_config() + with open(output_file, "w", encoding="utf-8") as fp: + yaml.safe_dump(server_config, fp) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/CHANGES.rst b/CHANGES.rst index 073caf36bae..b12020fef6e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,5 +1,38 @@ .. Red changelogs +Redbot 3.5.13 (2024-08-27) +========================== + +| Thanks to all these amazing people that contributed to this release: +| :ghuser:`aikaterna`, :ghuser:`Guyonsteroids`, :ghuser:`Jackenmen`, :ghuser:`Kowlin` + +Read before updating +-------------------- + +#. Information for Audio users that are using an external Lavalink instance (if you don't know what that is, you should skip this point): + + We've updated our default application.yml file and you should update your instance's ``application.yml`` accordingly. + More specifically, we bumped the version of YT source plugin. + `Download Red 3.5.13's default application.yml file `__ + +End-user changelog +------------------ + +Changes +******* + +- **Core - Dependencies** - Red's dependencies have been bumped (:issue:`6436`) + +Fixes +***** + +- **Cogs - Audio** - Updated Audio to support planned changes to Discord API scheduled for November (:issue:`6435`) +- **Cogs - Audio** - Fixed YT live stream detection (:issue:`6435`) +- **Cogs - Audio** - Fixed Red erroneously trying to send a message to a notification channel when one is not set (:issue:`6429`) +- **Cogs - Trivia - Lists** - Fixed spelling of Steven Spielberg's first name in the ``entertainment`` trivia list (:issue:`6434`) + +---- + Redbot 3.5.12 (2024-08-08) ========================== diff --git a/redbot/__init__.py b/redbot/__init__.py index a791f7f3a85..269db079fab 100644 --- a/redbot/__init__.py +++ b/redbot/__init__.py @@ -339,7 +339,7 @@ def _early_init(): # This is bumped automatically by release workflow (`.github/workflows/scripts/bump_version.py`) -_VERSION = "3.5.13.dev1" +_VERSION = "3.5.14.dev1" __version__, version_info = VersionInfo._get_version() diff --git a/redbot/cogs/audio/core/commands/locales/pt-BR.po b/redbot/cogs/audio/core/commands/locales/pt-BR.po index 4dbd2d5ccc4..b997d41c246 100644 --- a/redbot/cogs/audio/core/commands/locales/pt-BR.po +++ b/redbot/cogs/audio/core/commands/locales/pt-BR.po @@ -393,7 +393,30 @@ msgid "Set a playlist to auto-play songs from.\n\n" " ​ ​ ​ ​ `[p]audioset autoplay playlist MyGlobalPlaylist --scope Global`\n" " ​ ​ ​ ​ `[p]audioset autoplay playlist PersonalPlaylist --scope User --author Draper`\n" " " -msgstr "" +msgstr "Define uma lista de reprodução para a reprodução automática.\n\n" +" **Uso**:\n" +" ​ ​ ​ ​ `[p]audioset autoplay nome_lista_reproducao_OU_id [argumentos]`\n\n" +" **Argumentos**:\n" +" ​ ​ ​ ​ Os seguintes são todos opcionais:\n" +" ​ ​ ​ ​ ​ ​ ​ ​ --scope \n" +" ​ ​ ​ ​ ​ ​ ​ ​ --author [usuário]\n" +" ​ ​ ​ ​ ​ ​ ​ ​ --guild [servidor] **Somente o(a) dono(a) do bot pode usar esse**\n\n" +" **Scope** (escopo) pode ser um dos seguintes:\n" +" ​Global\n" +" ​ ​ ​ ​ Guild (servidor)\n" +" ​ ​ ​ ​ User (usuário(a))\n\n" +" **Author** (autor) pode ser um dos seguintes:\n" +" ​ ​ ​ ​ ID de usuário\n" +" ​ ​ ​ ​ Menção a usuário\n" +" ​ ​ ​ ​ NomeDeUsuario#123\n\n" +" **Guild** (servidor) pode ser um dos seguintes:\n" +" ​ ​ ​ ​ ID de servidor\n" +" ​ ​ ​ ​ Nome exato do servidor\n\n" +" Exemplos de uso:\n" +" ​ ​ ​ ​ `[p]audioset autoplay ListaDeReproducaoDaGuilda`\n" +" ​ ​ ​ ​ `[p]audioset autoplay ListaDeReproducaoGlobal --scope Global`\n" +" ​ ​ ​ ​ `[p]audioset autoplay ListaDeReproducaoPessoal --scope User --author Draper`\n" +" " #: redbot/cogs/audio/core/commands/audioset.py:497 #: redbot/cogs/audio/core/commands/playlists.py:105 diff --git a/redbot/cogs/audio/core/events/cog.py b/redbot/cogs/audio/core/events/cog.py index 8d5acdd96de..55bfa4f84a6 100644 --- a/redbot/cogs/audio/core/events/cog.py +++ b/redbot/cogs/audio/core/events/cog.py @@ -198,6 +198,8 @@ async def on_red_audio_track_auto_play( if not guild: return notify_channel = guild.get_channel_or_thread(player.fetch("notify_channel")) + if not notify_channel: + return has_perms = self._has_notify_perms(notify_channel) tries = 0 while not player._is_playing: diff --git a/redbot/cogs/audio/core/events/locales/ar-SA.po b/redbot/cogs/audio/core/events/locales/ar-SA.po index 69873194feb..7fad939fde3 100644 --- a/redbot/cogs/audio/core/events/locales/ar-SA.po +++ b/redbot/cogs/audio/core/events/locales/ar-SA.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Arabic\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: ar_SA\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/bg-BG.po b/redbot/cogs/audio/core/events/locales/bg-BG.po index ab8b5a969b9..c10c3009244 100644 --- a/redbot/cogs/audio/core/events/locales/bg-BG.po +++ b/redbot/cogs/audio/core/events/locales/bg-BG.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Bulgarian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: bg_BG\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/cs-CZ.po b/redbot/cogs/audio/core/events/locales/cs-CZ.po index 92c12d7c3b3..32f9839298b 100644 --- a/redbot/cogs/audio/core/events/locales/cs-CZ.po +++ b/redbot/cogs/audio/core/events/locales/cs-CZ.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: cs_CZ\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/da-DK.po b/redbot/cogs/audio/core/events/locales/da-DK.po index fa7aec3efd8..7a6c04ff0a0 100644 --- a/redbot/cogs/audio/core/events/locales/da-DK.po +++ b/redbot/cogs/audio/core/events/locales/da-DK.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Danish\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: da_DK\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/de-DE.po b/redbot/cogs/audio/core/events/locales/de-DE.po index 0f46254eb5c..62bb8924c57 100644 --- a/redbot/cogs/audio/core/events/locales/de-DE.po +++ b/redbot/cogs/audio/core/events/locales/de-DE.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: German\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: de_DE\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Automatische Wiedergabe gestartet." diff --git a/redbot/cogs/audio/core/events/locales/es-ES.po b/redbot/cogs/audio/core/events/locales/es-ES.po index b4399d4090f..80b54f64c2c 100644 --- a/redbot/cogs/audio/core/events/locales/es-ES.po +++ b/redbot/cogs/audio/core/events/locales/es-ES.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: es_ES\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Auto reproducción iniciada." diff --git a/redbot/cogs/audio/core/events/locales/fi-FI.po b/redbot/cogs/audio/core/events/locales/fi-FI.po index 9072dd4685d..7f0ee48c77a 100644 --- a/redbot/cogs/audio/core/events/locales/fi-FI.po +++ b/redbot/cogs/audio/core/events/locales/fi-FI.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Finnish\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: fi_FI\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Automaattinen toisto aloitettu." diff --git a/redbot/cogs/audio/core/events/locales/fr-FR.po b/redbot/cogs/audio/core/events/locales/fr-FR.po index fd365cde38b..26ef5a53e2d 100644 --- a/redbot/cogs/audio/core/events/locales/fr-FR.po +++ b/redbot/cogs/audio/core/events/locales/fr-FR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: French\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: fr_FR\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Lecture automatique démarrée." diff --git a/redbot/cogs/audio/core/events/locales/hi-IN.po b/redbot/cogs/audio/core/events/locales/hi-IN.po index ba720f72488..4bed46bb0c8 100644 --- a/redbot/cogs/audio/core/events/locales/hi-IN.po +++ b/redbot/cogs/audio/core/events/locales/hi-IN.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Hindi\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: hi_IN\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/hr-HR.po b/redbot/cogs/audio/core/events/locales/hr-HR.po index f29cc5092d6..b585e235fa1 100644 --- a/redbot/cogs/audio/core/events/locales/hr-HR.po +++ b/redbot/cogs/audio/core/events/locales/hr-HR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Croatian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: hr_HR\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Počela je automatska reprodukcija." diff --git a/redbot/cogs/audio/core/events/locales/hu-HU.po b/redbot/cogs/audio/core/events/locales/hu-HU.po index e49d07492a4..46151d5da8d 100644 --- a/redbot/cogs/audio/core/events/locales/hu-HU.po +++ b/redbot/cogs/audio/core/events/locales/hu-HU.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: hu_HU\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/id-ID.po b/redbot/cogs/audio/core/events/locales/id-ID.po index 5a5eff919f2..2ec43449ab8 100644 --- a/redbot/cogs/audio/core/events/locales/id-ID.po +++ b/redbot/cogs/audio/core/events/locales/id-ID.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Indonesian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: id_ID\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/it-IT.po b/redbot/cogs/audio/core/events/locales/it-IT.po index 9b4ae0f9771..7669c177130 100644 --- a/redbot/cogs/audio/core/events/locales/it-IT.po +++ b/redbot/cogs/audio/core/events/locales/it-IT.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: it_IT\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/ja-JP.po b/redbot/cogs/audio/core/events/locales/ja-JP.po index e643c6aa5cf..988b0067e3a 100644 --- a/redbot/cogs/audio/core/events/locales/ja-JP.po +++ b/redbot/cogs/audio/core/events/locales/ja-JP.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Japanese\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: ja_JP\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "自動再生を開始しました" diff --git a/redbot/cogs/audio/core/events/locales/ko-KR.po b/redbot/cogs/audio/core/events/locales/ko-KR.po index e91f518710a..6f2ef586111 100644 --- a/redbot/cogs/audio/core/events/locales/ko-KR.po +++ b/redbot/cogs/audio/core/events/locales/ko-KR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Korean\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: ko_KR\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "자동재생이 시작되었어요" diff --git a/redbot/cogs/audio/core/events/locales/nb-NO.po b/redbot/cogs/audio/core/events/locales/nb-NO.po index 444c3f656ed..d22386aea49 100644 --- a/redbot/cogs/audio/core/events/locales/nb-NO.po +++ b/redbot/cogs/audio/core/events/locales/nb-NO.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Norwegian Bokmal\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: nb_NO\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Automatisk avspilling startet." diff --git a/redbot/cogs/audio/core/events/locales/nl-NL.po b/redbot/cogs/audio/core/events/locales/nl-NL.po index dd195d17353..3c65b751fef 100644 --- a/redbot/cogs/audio/core/events/locales/nl-NL.po +++ b/redbot/cogs/audio/core/events/locales/nl-NL.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Dutch\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: nl_NL\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/pl-PL.po b/redbot/cogs/audio/core/events/locales/pl-PL.po index 022abdeab65..5ca0cb09a74 100644 --- a/redbot/cogs/audio/core/events/locales/pl-PL.po +++ b/redbot/cogs/audio/core/events/locales/pl-PL.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Polish\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: pl_PL\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Automatyczne odtwarzanie rozpoczęte." diff --git a/redbot/cogs/audio/core/events/locales/pt-BR.po b/redbot/cogs/audio/core/events/locales/pt-BR.po index b8c18f2ece5..65cf25922f0 100644 --- a/redbot/cogs/audio/core/events/locales/pt-BR.po +++ b/redbot/cogs/audio/core/events/locales/pt-BR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: pt_BR\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Reprodução automática iniciada." diff --git a/redbot/cogs/audio/core/events/locales/pt-PT.po b/redbot/cogs/audio/core/events/locales/pt-PT.po index f38964df888..1287fb00698 100644 --- a/redbot/cogs/audio/core/events/locales/pt-PT.po +++ b/redbot/cogs/audio/core/events/locales/pt-PT.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Portuguese\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: pt_PT\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Reprodução automática iniciada." diff --git a/redbot/cogs/audio/core/events/locales/ru-RU.po b/redbot/cogs/audio/core/events/locales/ru-RU.po index 9abbd4e4a25..b5c417e2a33 100644 --- a/redbot/cogs/audio/core/events/locales/ru-RU.po +++ b/redbot/cogs/audio/core/events/locales/ru-RU.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Russian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: ru_RU\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Автоматическое воспроизведение запущено." diff --git a/redbot/cogs/audio/core/events/locales/sk-SK.po b/redbot/cogs/audio/core/events/locales/sk-SK.po index 3b79923d0c5..6c815116a9b 100644 --- a/redbot/cogs/audio/core/events/locales/sk-SK.po +++ b/redbot/cogs/audio/core/events/locales/sk-SK.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Slovak\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: sk_SK\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Automatické prehrávanie sa spustilo." diff --git a/redbot/cogs/audio/core/events/locales/sl-SI.po b/redbot/cogs/audio/core/events/locales/sl-SI.po index 79d4ccbf78d..506d033631e 100644 --- a/redbot/cogs/audio/core/events/locales/sl-SI.po +++ b/redbot/cogs/audio/core/events/locales/sl-SI.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Slovenian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: sl_SI\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Samodejno predvajanje se je začelo." diff --git a/redbot/cogs/audio/core/events/locales/sv-SE.po b/redbot/cogs/audio/core/events/locales/sv-SE.po index 0bd38a39b80..fd95c6d87bd 100644 --- a/redbot/cogs/audio/core/events/locales/sv-SE.po +++ b/redbot/cogs/audio/core/events/locales/sv-SE.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Swedish\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: sv_SE\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/tr-TR.po b/redbot/cogs/audio/core/events/locales/tr-TR.po index d93d1cb875c..a646d1f7d19 100644 --- a/redbot/cogs/audio/core/events/locales/tr-TR.po +++ b/redbot/cogs/audio/core/events/locales/tr-TR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Turkish\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: tr_TR\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Otomatik çalma başladı." diff --git a/redbot/cogs/audio/core/events/locales/uk-UA.po b/redbot/cogs/audio/core/events/locales/uk-UA.po index 9a7c70ca08c..4adaa1faf7c 100644 --- a/redbot/cogs/audio/core/events/locales/uk-UA.po +++ b/redbot/cogs/audio/core/events/locales/uk-UA.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: uk_UA\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/vi-VN.po b/redbot/cogs/audio/core/events/locales/vi-VN.po index fc62aa4bc4a..462aba9af14 100644 --- a/redbot/cogs/audio/core/events/locales/vi-VN.po +++ b/redbot/cogs/audio/core/events/locales/vi-VN.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Vietnamese\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: vi_VN\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "Tự động phát đã bắt đầu." diff --git a/redbot/cogs/audio/core/events/locales/zh-CN.po b/redbot/cogs/audio/core/events/locales/zh-CN.po index 9b82c7a7644..4a993c08d2f 100644 --- a/redbot/cogs/audio/core/events/locales/zh-CN.po +++ b/redbot/cogs/audio/core/events/locales/zh-CN.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: zh_CN\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "" diff --git a/redbot/cogs/audio/core/events/locales/zh-TW.po b/redbot/cogs/audio/core/events/locales/zh-TW.po index 7a525fa18df..3db1150b477 100644 --- a/redbot/cogs/audio/core/events/locales/zh-TW.po +++ b/redbot/cogs/audio/core/events/locales/zh-TW.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: red-discordbot\n" -"POT-Creation-Date: 2024-07-10 18:37+0000\n" +"POT-Creation-Date: 2024-08-26 17:53+0000\n" "Last-Translator: \n" "Language-Team: Chinese Traditional\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "X-Crowdin-File-ID: 670\n" "Language: zh_TW\n" -#: redbot/cogs/audio/core/events/cog.py:216 +#: redbot/cogs/audio/core/events/cog.py:218 msgid "Auto Play started." msgstr "已開始自動播放。" diff --git a/redbot/cogs/audio/managed_node/__init__.py b/redbot/cogs/audio/managed_node/__init__.py new file mode 100644 index 00000000000..52d0a443b99 --- /dev/null +++ b/redbot/cogs/audio/managed_node/__init__.py @@ -0,0 +1,16 @@ +# Note: contents of this package are meant to be self-contained +# and should not depend on anything in Red or on external dependencies. + +from .ll_server_config import generate_server_config, get_default_server_config +from .ll_version import LAVALINK_BUILD_LINE, LavalinkOldVersion, LavalinkVersion +from .version_pins import JAR_VERSION, YT_PLUGIN_VERSION + +__all__ = ( + "generate_server_config", + "get_default_server_config", + "LAVALINK_BUILD_LINE", + "LavalinkOldVersion", + "LavalinkVersion", + "JAR_VERSION", + "YT_PLUGIN_VERSION", +) diff --git a/redbot/cogs/audio/managed_node/ll_server_config.py b/redbot/cogs/audio/managed_node/ll_server_config.py new file mode 100644 index 00000000000..3e9faec8471 --- /dev/null +++ b/redbot/cogs/audio/managed_node/ll_server_config.py @@ -0,0 +1,119 @@ +from __future__ import annotations + +from typing import Any, Dict, Final + +from . import version_pins + +__all__ = ( + "DEFAULT_LAVALINK_YAML", + "get_default_server_config", + "generate_server_config", + "change_dict_naming_convention", +) + +YT_PLUGIN_REPOSITORY: Final[str] = "https://maven.lavalink.dev/releases" + +DEFAULT_LAVALINK_YAML = { + # The nesting structure of this dict is very important, it's a 1:1 mirror of application.yaml in JSON + "yaml__server__address": "localhost", + "yaml__server__port": 2333, + "yaml__lavalink__server__password": "youshallnotpass", + "yaml__lavalink__server__sources__http": True, + "yaml__lavalink__server__sources__bandcamp": True, + "yaml__lavalink__server__sources__local": True, + "yaml__lavalink__server__sources__soundcloud": True, + "yaml__lavalink__server__sources__youtube": True, + "yaml__lavalink__server__sources__twitch": True, + "yaml__lavalink__server__sources__vimeo": True, + "yaml__lavalink__server__bufferDurationMs": 400, + "yaml__lavalink__server__frameBufferDurationMs": 1000, + # 100 pages - 100 entries per page = 10,000 tracks which is the Audio Limit for a single playlist. + "yaml__lavalink__server__youtubePlaylistLoadLimit": 100, + "yaml__lavalink__server__playerUpdateInterval": 1, + "yaml__lavalink__server__youtubeSearchEnabled": True, + "yaml__lavalink__server__soundcloudSearchEnabled": True, + "yaml__lavalink__server__gc_warnings": True, + "yaml__metrics__prometheus__enabled": False, + "yaml__metrics__prometheus__endpoint": "/metrics", + "yaml__sentry__dsn": "", + "yaml__sentry__environment": "", + "yaml__logging__file__path": "./logs/", + "yaml__logging__level__root": "INFO", + "yaml__logging__level__lavalink": "INFO", + "yaml__logging__logback__rollingpolicy__max_history": 15, + "yaml__logging__logback__rollingpolicy__max_size": "10MB", + # plugin configuration - note that the plugin may be disabled by the manager + "yaml__plugins__youtube__enabled": True, + "yaml__plugins__youtube__allowSearch": True, + "yaml__plugins__youtube__allowDirectVideoIds": True, + "yaml__plugins__youtube__allowDirectPlaylistIds": True, + "yaml__plugins__youtube__clients": [ + "MUSIC", + "WEB", + "ANDROID_TESTSUITE", + "TVHTML5EMBEDDED", + "ANDROID_LITE", + "MEDIA_CONNECT", + "IOS", + ], + "yaml__plugins__youtube__WEB__playback": True, + "yaml__plugins__youtube__TVHTML5EMBEDDED__playlistLoading": False, + "yaml__plugins__youtube__TVHTML5EMBEDDED__videoLoading": False, + "yaml__plugins__youtube__TVHTML5EMBEDDED__searching": False, +} + + +def _unflatten_config_defaults(config_defaults: Dict[str, Any]) -> Dict[str, Any]: + ret: Dict[str, Any] = {} + + # based on Config._get_defaults_dict() + for flat_key, value in config_defaults.items(): + keys = flat_key.split("__") + partial = ret + for idx, key in enumerate(keys, start=1): + if idx == len(keys): + partial[key] = value + else: + partial = partial.setdefault(key, {}) + + return ret + + +def get_default_server_config() -> Dict[str, Any]: + return generate_server_config(_unflatten_config_defaults(DEFAULT_LAVALINK_YAML)["yaml"]) + + +def generate_server_config(config_data: Dict[str, Any]) -> Dict[str, Any]: + data = change_dict_naming_convention(config_data) + ll_config = data["lavalink"] + sources = ll_config["server"]["sources"] + plugins = ll_config.setdefault("plugins", []) + + enable_yt_plugin = sources["youtube"] + if enable_yt_plugin: + sources["youtube"] = False + yt_plugin = { + "dependency": f"dev.lavalink.youtube:youtube-plugin:{version_pins.YT_PLUGIN_VERSION}", + "repository": YT_PLUGIN_REPOSITORY, + } + plugins.append(yt_plugin) + + return data + + +# This assumes all keys with `_` should be converted from `part1_part2` to `part1-part2` +def _convert_function(key: str) -> str: + return key.replace("_", "-") + + +def change_dict_naming_convention(data: Any) -> Any: + ret: Any = data + if isinstance(data, dict): + ret = {} + for key, value in data.items(): + ret[_convert_function(key)] = change_dict_naming_convention(value) + elif isinstance(data, list): + ret = [] + for value in data: + ret.append(change_dict_naming_convention(value)) + return ret diff --git a/redbot/cogs/audio/managed_node/ll_version.py b/redbot/cogs/audio/managed_node/ll_version.py new file mode 100644 index 00000000000..a29f5326fe1 --- /dev/null +++ b/redbot/cogs/audio/managed_node/ll_version.py @@ -0,0 +1,204 @@ +from __future__ import annotations + +import re +from typing import Final, Optional, Pattern, Tuple + +__all__ = ( + "LAVALINK_BUILD_LINE", + "LavalinkOldVersion", + "LavalinkVersion", +) + + +# present until Lavalink 3.5-rc4 +LAVALINK_BUILD_LINE: Final[Pattern] = re.compile(rb"^Build:\s+(?P\d+)$", re.MULTILINE) +# we don't actually care about what the version format before 3.5-rc4 is exactly +# as the comparison is based entirely on the build number +_LAVALINK_VERSION_LINE_PRE35: Final[Pattern] = re.compile( + rb"^Version:\s+(?P\S+)$", re.MULTILINE | re.VERBOSE +) +# used for LL versions >=3.5-rc4 but below 3.6. +# Since this only applies to historical version, this regex is based only on +# version numbers that actually existed, not ones that technically could. +_LAVALINK_VERSION_LINE_PRE36: Final[Pattern] = re.compile( + rb""" + ^ + Version:\s+ + (?P + (?P3)\.(?P[0-5]) + # Before LL 3.6, when patch version == 0, it was stripped from the version string + (?:\.(?P[1-9]\d*))? + # Before LL 3.6, the dot in rc.N was optional + (?:-rc\.?(?P0|[1-9]\d*))? + # additional build metadata, can be used by our downstream Lavalink + # if we need to alter an upstream release + (?:\+red\.(?P[1-9]\d*))? + ) + $ + """, + re.MULTILINE | re.VERBOSE, +) +# used for LL 3.6 and newer +# This regex is limited to the realistic usage in the LL version number, +# not everything that could be a part of it according to the spec. +# We can easily release an update to this regex in the future if it ever becomes necessary. +_LAVALINK_VERSION_LINE: Final[Pattern] = re.compile( + rb""" + ^ + Version:\s+ + (?P + (?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*) + (?:-rc\.(?P0|[1-9]\d*))? + # additional build metadata, can be used by our downstream Lavalink + # if we need to alter an upstream release + (?:\+red\.(?P[1-9]\d*))? + ) + $ + """, + re.MULTILINE | re.VERBOSE, +) + + +class LavalinkOldVersion: + def __init__(self, raw_version: str, *, build_number: int) -> None: + self.raw_version = raw_version + self.build_number = build_number + + def __str__(self) -> str: + return f"{self.raw_version}_{self.build_number}" + + @classmethod + def from_version_output(cls, output: bytes) -> LavalinkOldVersion: + build_match = LAVALINK_BUILD_LINE.search(output) + if build_match is None: + raise ValueError( + "Could not find 'Build' line in the given `--version` output," + " or invalid build number given." + ) + version_match = _LAVALINK_VERSION_LINE_PRE35.search(output) + if version_match is None: + raise ValueError( + "Could not find 'Version' line in the given `--version` output," + " or invalid version number given." + ) + return cls( + raw_version=version_match["version"].decode(), + build_number=int(build_match["build"]), + ) + + def __eq__(self, other: object) -> bool: + if isinstance(other, LavalinkOldVersion): + return self.build_number == other.build_number + if isinstance(other, LavalinkVersion): + return False + return NotImplemented + + def __lt__(self, other: object) -> bool: + if isinstance(other, LavalinkOldVersion): + return self.build_number < other.build_number + if isinstance(other, LavalinkVersion): + return True + return NotImplemented + + def __le__(self, other: object) -> bool: + if isinstance(other, LavalinkOldVersion): + return self.build_number <= other.build_number + if isinstance(other, LavalinkVersion): + return True + return NotImplemented + + def __gt__(self, other: object) -> bool: + if isinstance(other, LavalinkOldVersion): + return self.build_number > other.build_number + if isinstance(other, LavalinkVersion): + return False + return NotImplemented + + def __ge__(self, other: object) -> bool: + if isinstance(other, LavalinkOldVersion): + return self.build_number >= other.build_number + if isinstance(other, LavalinkVersion): + return False + return NotImplemented + + +class LavalinkVersion: + def __init__( + self, + major: int, + minor: int, + patch: int = 0, + *, + rc: Optional[int] = None, + red: int = 0, + ) -> None: + self.major = major + self.minor = minor + self.patch = patch + self.rc = rc + self.red = red + + def __str__(self) -> str: + version = f"{self.major}.{self.minor}.{self.patch}" + if self.rc is not None: + version += f"-rc.{self.rc}" + if self.red: + version += f"+red.{self.red}" + return version + + @classmethod + def from_version_output(cls, output: bytes) -> LavalinkVersion: + match = _LAVALINK_VERSION_LINE.search(output) + if match is None: + # >=3.5-rc4, <3.6 + match = _LAVALINK_VERSION_LINE_PRE36.search(output) + if match is None: + raise ValueError( + "Could not find 'Version' line in the given `--version` output," + " or invalid version number given." + ) + return cls( + major=int(match["major"]), + minor=int(match["minor"]), + patch=int(match["patch"] or 0), + rc=int(match["rc"]) if match["rc"] is not None else None, + red=int(match["red"] or 0), + ) + + def _get_comparison_tuple(self) -> Tuple[int, int, int, bool, int, int]: + return self.major, self.minor, self.patch, self.rc is None, self.rc or 0, self.red + + def __eq__(self, other: object) -> bool: + if isinstance(other, LavalinkVersion): + return self._get_comparison_tuple() == other._get_comparison_tuple() + if isinstance(other, LavalinkOldVersion): + return False + return NotImplemented + + def __lt__(self, other: object) -> bool: + if isinstance(other, LavalinkVersion): + return self._get_comparison_tuple() < other._get_comparison_tuple() + if isinstance(other, LavalinkOldVersion): + return False + return NotImplemented + + def __le__(self, other: object) -> bool: + if isinstance(other, LavalinkVersion): + return self._get_comparison_tuple() <= other._get_comparison_tuple() + if isinstance(other, LavalinkOldVersion): + return False + return NotImplemented + + def __gt__(self, other: object) -> bool: + if isinstance(other, LavalinkVersion): + return self._get_comparison_tuple() > other._get_comparison_tuple() + if isinstance(other, LavalinkOldVersion): + return True + return NotImplemented + + def __ge__(self, other: object) -> bool: + if isinstance(other, LavalinkVersion): + return self._get_comparison_tuple() >= other._get_comparison_tuple() + if isinstance(other, LavalinkOldVersion): + return True + return NotImplemented diff --git a/redbot/cogs/audio/managed_node/locales/ar-SA.po b/redbot/cogs/audio/managed_node/locales/ar-SA.po new file mode 100644 index 00000000000..ed2502e0be3 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/ar-SA.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\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-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: ar\n" +"X-Crowdin-File-ID: 728\n" +"Language: ar_SA\n" + diff --git a/redbot/cogs/audio/managed_node/locales/bg-BG.po b/redbot/cogs/audio/managed_node/locales/bg-BG.po new file mode 100644 index 00000000000..b4c1559097f --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/bg-BG.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: bg\n" +"X-Crowdin-File-ID: 728\n" +"Language: bg_BG\n" + diff --git a/redbot/cogs/audio/managed_node/locales/cs-CZ.po b/redbot/cogs/audio/managed_node/locales/cs-CZ.po new file mode 100644 index 00000000000..c497337c7d0 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/cs-CZ.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: cs\n" +"X-Crowdin-File-ID: 728\n" +"Language: cs_CZ\n" + diff --git a/redbot/cogs/audio/managed_node/locales/da-DK.po b/redbot/cogs/audio/managed_node/locales/da-DK.po new file mode 100644 index 00000000000..9e4ff29f652 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/da-DK.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: da\n" +"X-Crowdin-File-ID: 728\n" +"Language: da_DK\n" + diff --git a/redbot/cogs/audio/managed_node/locales/de-DE.po b/redbot/cogs/audio/managed_node/locales/de-DE.po new file mode 100644 index 00000000000..a61d99b1e29 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/de-DE.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File-ID: 728\n" +"Language: de_DE\n" + diff --git a/redbot/cogs/audio/managed_node/locales/es-ES.po b/redbot/cogs/audio/managed_node/locales/es-ES.po new file mode 100644 index 00000000000..b2893809457 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/es-ES.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File-ID: 728\n" +"Language: es_ES\n" + diff --git a/redbot/cogs/audio/managed_node/locales/fi-FI.po b/redbot/cogs/audio/managed_node/locales/fi-FI.po new file mode 100644 index 00000000000..2fbc999317b --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/fi-FI.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File-ID: 728\n" +"Language: fi_FI\n" + diff --git a/redbot/cogs/audio/managed_node/locales/fr-FR.po b/redbot/cogs/audio/managed_node/locales/fr-FR.po new file mode 100644 index 00000000000..e6c07bf7982 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/fr-FR.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File-ID: 728\n" +"Language: fr_FR\n" + diff --git a/redbot/cogs/audio/managed_node/locales/hi-IN.po b/redbot/cogs/audio/managed_node/locales/hi-IN.po new file mode 100644 index 00000000000..07a5f5bb4e3 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/hi-IN.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \n" +"Language-Team: Hindi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: hi\n" +"X-Crowdin-File-ID: 728\n" +"Language: hi_IN\n" + diff --git a/redbot/cogs/audio/managed_node/locales/hr-HR.po b/redbot/cogs/audio/managed_node/locales/hr-HR.po new file mode 100644 index 00000000000..2ea1ff38b8c --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/hr-HR.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \n" +"Language-Team: Croatian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: hr\n" +"X-Crowdin-File-ID: 728\n" +"Language: hr_HR\n" + diff --git a/redbot/cogs/audio/managed_node/locales/hu-HU.po b/redbot/cogs/audio/managed_node/locales/hu-HU.po new file mode 100644 index 00000000000..90a587ccabf --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/hu-HU.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: hu\n" +"X-Crowdin-File-ID: 728\n" +"Language: hu_HU\n" + diff --git a/redbot/cogs/audio/managed_node/locales/id-ID.po b/redbot/cogs/audio/managed_node/locales/id-ID.po new file mode 100644 index 00000000000..8d088dfa6d5 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/id-ID.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: id\n" +"X-Crowdin-File-ID: 728\n" +"Language: id_ID\n" + diff --git a/redbot/cogs/audio/managed_node/locales/it-IT.po b/redbot/cogs/audio/managed_node/locales/it-IT.po new file mode 100644 index 00000000000..e6865a47cf7 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/it-IT.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File-ID: 728\n" +"Language: it_IT\n" + diff --git a/redbot/cogs/audio/managed_node/locales/ja-JP.po b/redbot/cogs/audio/managed_node/locales/ja-JP.po new file mode 100644 index 00000000000..77e989410ea --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/ja-JP.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File-ID: 728\n" +"Language: ja_JP\n" + diff --git a/redbot/cogs/audio/managed_node/locales/ko-KR.po b/redbot/cogs/audio/managed_node/locales/ko-KR.po new file mode 100644 index 00000000000..2be912ea261 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/ko-KR.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File-ID: 728\n" +"Language: ko_KR\n" + diff --git a/redbot/cogs/audio/managed_node/locales/nb-NO.po b/redbot/cogs/audio/managed_node/locales/nb-NO.po new file mode 100644 index 00000000000..338e9183f68 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/nb-NO.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \n" +"Language-Team: Norwegian Bokmal\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: nb\n" +"X-Crowdin-File-ID: 728\n" +"Language: nb_NO\n" + diff --git a/redbot/cogs/audio/managed_node/locales/nl-NL.po b/redbot/cogs/audio/managed_node/locales/nl-NL.po new file mode 100644 index 00000000000..9087918753e --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/nl-NL.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File-ID: 728\n" +"Language: nl_NL\n" + diff --git a/redbot/cogs/audio/managed_node/locales/pl-PL.po b/redbot/cogs/audio/managed_node/locales/pl-PL.po new file mode 100644 index 00000000000..3860f8a9fc8 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/pl-PL.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\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-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File-ID: 728\n" +"Language: pl_PL\n" + diff --git a/redbot/cogs/audio/managed_node/locales/pt-BR.po b/redbot/cogs/audio/managed_node/locales/pt-BR.po new file mode 100644 index 00000000000..dda657b0e13 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/pt-BR.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File-ID: 728\n" +"Language: pt_BR\n" + diff --git a/redbot/cogs/audio/managed_node/locales/pt-PT.po b/redbot/cogs/audio/managed_node/locales/pt-PT.po new file mode 100644 index 00000000000..30b809bcfe1 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/pt-PT.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File-ID: 728\n" +"Language: pt_PT\n" + diff --git a/redbot/cogs/audio/managed_node/locales/ru-RU.po b/redbot/cogs/audio/managed_node/locales/ru-RU.po new file mode 100644 index 00000000000..fc13a7cf78c --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/ru-RU.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\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-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File-ID: 728\n" +"Language: ru_RU\n" + diff --git a/redbot/cogs/audio/managed_node/locales/sk-SK.po b/redbot/cogs/audio/managed_node/locales/sk-SK.po new file mode 100644 index 00000000000..a91265d5d77 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/sk-SK.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: sk\n" +"X-Crowdin-File-ID: 728\n" +"Language: sk_SK\n" + diff --git a/redbot/cogs/audio/managed_node/locales/sl-SI.po b/redbot/cogs/audio/managed_node/locales/sl-SI.po new file mode 100644 index 00000000000..1df1a30c6fb --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/sl-SI.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \n" +"Language-Team: Slovenian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: sl\n" +"X-Crowdin-File-ID: 728\n" +"Language: sl_SI\n" + diff --git a/redbot/cogs/audio/managed_node/locales/sv-SE.po b/redbot/cogs/audio/managed_node/locales/sv-SE.po new file mode 100644 index 00000000000..a22f7f868e2 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/sv-SE.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: sv-SE\n" +"X-Crowdin-File-ID: 728\n" +"Language: sv_SE\n" + diff --git a/redbot/cogs/audio/managed_node/locales/tr-TR.po b/redbot/cogs/audio/managed_node/locales/tr-TR.po new file mode 100644 index 00000000000..a0c6b29e7ed --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/tr-TR.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File-ID: 728\n" +"Language: tr_TR\n" + diff --git a/redbot/cogs/audio/managed_node/locales/uk-UA.po b/redbot/cogs/audio/managed_node/locales/uk-UA.po new file mode 100644 index 00000000000..72de7596183 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/uk-UA.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\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-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File-ID: 728\n" +"Language: uk_UA\n" + diff --git a/redbot/cogs/audio/managed_node/locales/vi-VN.po b/redbot/cogs/audio/managed_node/locales/vi-VN.po new file mode 100644 index 00000000000..c0bb625167e --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/vi-VN.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \n" +"Language-Team: Vietnamese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: vi\n" +"X-Crowdin-File-ID: 728\n" +"Language: vi_VN\n" + diff --git a/redbot/cogs/audio/managed_node/locales/zh-CN.po b/redbot/cogs/audio/managed_node/locales/zh-CN.po new file mode 100644 index 00000000000..31f6dbe1226 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/zh-CN.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: zh-CN\n" +"X-Crowdin-File-ID: 728\n" +"Language: zh_CN\n" + diff --git a/redbot/cogs/audio/managed_node/locales/zh-TW.po b/redbot/cogs/audio/managed_node/locales/zh-TW.po new file mode 100644 index 00000000000..3085cf254d3 --- /dev/null +++ b/redbot/cogs/audio/managed_node/locales/zh-TW.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: red-discordbot\n" +"POT-Creation-Date: 2024-08-26 17:35+0000\n" +"Last-Translator: \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.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: red-discordbot\n" +"X-Crowdin-Project-ID: 289505\n" +"X-Crowdin-Language: zh-TW\n" +"X-Crowdin-File-ID: 728\n" +"Language: zh_TW\n" + diff --git a/redbot/cogs/audio/managed_node/version_pins.py b/redbot/cogs/audio/managed_node/version_pins.py new file mode 100644 index 00000000000..728e7634611 --- /dev/null +++ b/redbot/cogs/audio/managed_node/version_pins.py @@ -0,0 +1,9 @@ +from typing import Final + +from .ll_version import LavalinkVersion + +__all__ = ("JAR_VERSION", "YT_PLUGIN_VERSION") + + +JAR_VERSION: Final[LavalinkVersion] = LavalinkVersion(3, 7, 12, red=1) +YT_PLUGIN_VERSION: Final[str] = "1.7.2" diff --git a/redbot/cogs/audio/manager.py b/redbot/cogs/audio/manager.py index 89dcfdec25c..93ad89e3d6a 100644 --- a/redbot/cogs/audio/manager.py +++ b/redbot/cogs/audio/manager.py @@ -22,6 +22,7 @@ from redbot.core import data_manager, Config from redbot.core.i18n import Translator +from . import managed_node from .errors import ( LavalinkDownloadFailed, InvalidArchitectureException, @@ -35,8 +36,8 @@ NoProcessFound, NodeUnhealthy, ) +from .managed_node.ll_version import LAVALINK_BUILD_LINE, LavalinkVersion, LavalinkOldVersion from .utils import ( - change_dict_naming_convention, get_max_allocation_size, replace_p_with_prefix, ) @@ -55,7 +56,7 @@ ) _FAILED_TO_START: Final[Pattern[bytes]] = re.compile(rb"Web server failed to start\. (.*)") -# Version regexes +# Java version regexes # # We expect the output to look something like: # $ java -version @@ -103,210 +104,14 @@ LAVALINK_BUILD_TIME_LINE: Final[Pattern] = re.compile( rb"^Build time:\s+(?P\d+[.\d+]*).*$", re.MULTILINE ) -# present until Lavalink 3.5-rc4 -LAVALINK_BUILD_LINE: Final[Pattern] = re.compile(rb"^Build:\s+(?P\d+)$", re.MULTILINE) -# we don't actually care about what the version format before 3.5-rc4 is exactly -# as the comparison is based entirely on the build number -LAVALINK_VERSION_LINE_PRE35: Final[Pattern] = re.compile( - rb"^Version:\s+(?P\S+)$", re.MULTILINE | re.VERBOSE -) -# used for LL versions >=3.5-rc4 but below 3.6. -# Since this only applies to historical version, this regex is based only on -# version numbers that actually existed, not ones that technically could. -LAVALINK_VERSION_LINE_PRE36: Final[Pattern] = re.compile( - rb""" - ^ - Version:\s+ - (?P - (?P3)\.(?P[0-5]) - # Before LL 3.6, when patch version == 0, it was stripped from the version string - (?:\.(?P[1-9]\d*))? - # Before LL 3.6, the dot in rc.N was optional - (?:-rc\.?(?P0|[1-9]\d*))? - # additional build metadata, can be used by our downstream Lavalink - # if we need to alter an upstream release - (?:\+red\.(?P[1-9]\d*))? - ) - $ - """, - re.MULTILINE | re.VERBOSE, -) -# used for LL 3.6 and newer -# This regex is limited to the realistic usage in the LL version number, -# not everything that could be a part of it according to the spec. -# We can easily release an update to this regex in the future if it ever becomes necessary. -LAVALINK_VERSION_LINE: Final[Pattern] = re.compile( - rb""" - ^ - Version:\s+ - (?P - (?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*) - (?:-rc\.(?P0|[1-9]\d*))? - # additional build metadata, can be used by our downstream Lavalink - # if we need to alter an upstream release - (?:\+red\.(?P[1-9]\d*))? - ) - $ - """, - re.MULTILINE | re.VERBOSE, -) - - -class LavalinkOldVersion: - def __init__(self, raw_version: str, *, build_number: int) -> None: - self.raw_version = raw_version - self.build_number = build_number - - def __str__(self) -> None: - return f"{self.raw_version}_{self.build_number}" - - @classmethod - def from_version_output(cls, output: bytes) -> Self: - build_match = LAVALINK_BUILD_LINE.search(output) - if build_match is None: - raise ValueError( - "Could not find 'Build' line in the given `--version` output," - " or invalid build number given." - ) - version_match = LAVALINK_VERSION_LINE_PRE35.search(output) - if version_match is None: - raise ValueError( - "Could not find 'Version' line in the given `--version` output," - " or invalid version number given." - ) - return cls( - raw_version=version_match["version"].decode(), - build_number=int(build_match["build"]), - ) - - def __eq__(self, other: object) -> bool: - if isinstance(other, LavalinkOldVersion): - return self.build_number == other.build_number - if isinstance(other, LavalinkVersion): - return False - return NotImplemented - - def __lt__(self, other: object) -> bool: - if isinstance(other, LavalinkOldVersion): - return self.build_number < other.build_number - if isinstance(other, LavalinkVersion): - return True - return NotImplemented - - def __le__(self, other: object) -> bool: - if isinstance(other, LavalinkOldVersion): - return self.build_number <= other.build_number - if isinstance(other, LavalinkVersion): - return True - return NotImplemented - - def __gt__(self, other: object) -> bool: - if isinstance(other, LavalinkOldVersion): - return self.build_number > other.build_number - if isinstance(other, LavalinkVersion): - return False - return NotImplemented - - def __ge__(self, other: object) -> bool: - if isinstance(other, LavalinkOldVersion): - return self.build_number >= other.build_number - if isinstance(other, LavalinkVersion): - return False - return NotImplemented - - -class LavalinkVersion: - def __init__( - self, - major: int, - minor: int, - patch: int = 0, - *, - rc: Optional[int] = None, - red: int = 0, - ) -> None: - self.major = major - self.minor = minor - self.patch = patch - self.rc = rc - self.red = red - - def __str__(self) -> None: - version = f"{self.major}.{self.minor}.{self.patch}" - if self.rc is not None: - version += f"-rc.{self.rc}" - if self.red: - version += f"+red.{self.red}" - return version - - @classmethod - def from_version_output(cls, output: bytes) -> Self: - match = LAVALINK_VERSION_LINE.search(output) - if match is None: - # >=3.5-rc4, <3.6 - match = LAVALINK_VERSION_LINE_PRE36.search(output) - if match is None: - raise ValueError( - "Could not find 'Version' line in the given `--version` output," - " or invalid version number given." - ) - return LavalinkVersion( - major=int(match["major"]), - minor=int(match["minor"]), - patch=int(match["patch"] or 0), - rc=int(match["rc"]) if match["rc"] is not None else None, - red=int(match["red"] or 0), - ) - - def _get_comparison_tuple(self) -> Tuple[int, int, int, bool, int, int]: - return self.major, self.minor, self.patch, self.rc is None, self.rc or 0, self.red - - def __eq__(self, other: object) -> bool: - if isinstance(other, LavalinkVersion): - return self._get_comparison_tuple() == other._get_comparison_tuple() - if isinstance(other, LavalinkOldVersion): - return False - return NotImplemented - - def __lt__(self, other: object) -> bool: - if isinstance(other, LavalinkVersion): - return self._get_comparison_tuple() < other._get_comparison_tuple() - if isinstance(other, LavalinkOldVersion): - return False - return NotImplemented - - def __le__(self, other: object) -> bool: - if isinstance(other, LavalinkVersion): - return self._get_comparison_tuple() <= other._get_comparison_tuple() - if isinstance(other, LavalinkOldVersion): - return False - return NotImplemented - - def __gt__(self, other: object) -> bool: - if isinstance(other, LavalinkVersion): - return self._get_comparison_tuple() > other._get_comparison_tuple() - if isinstance(other, LavalinkOldVersion): - return True - return NotImplemented - - def __ge__(self, other: object) -> bool: - if isinstance(other, LavalinkVersion): - return self._get_comparison_tuple() >= other._get_comparison_tuple() - if isinstance(other, LavalinkOldVersion): - return True - return NotImplemented class ServerManager: - JAR_VERSION: Final[str] = LavalinkVersion(3, 7, 12, red=1) - YT_PLUGIN_VERSION: Final[str] = "1.7.2" - LAVALINK_DOWNLOAD_URL: Final[str] = ( "https://github.com/Cog-Creators/Lavalink-Jars/releases/download/" - f"{JAR_VERSION}/" + f"{managed_node.JAR_VERSION}/" "Lavalink.jar" ) - YT_PLUGIN_REPOSITORY: Final[str] = "https://maven.lavalink.dev/releases" _java_available: ClassVar[Optional[bool]] = None _java_version: ClassVar[Optional[Tuple[int, int]]] = None @@ -429,19 +234,7 @@ async def _start(self, java_path: str) -> None: raise async def process_settings(self): - data = change_dict_naming_convention(await self._config.yaml.all()) - ll_config = data["lavalink"] - sources = ll_config["server"]["sources"] - plugins = ll_config.setdefault("plugins", []) - - enable_yt_plugin = sources["youtube"] - if enable_yt_plugin: - sources["youtube"] = False - yt_plugin = { - "dependency": f"dev.lavalink.youtube:youtube-plugin:{self.YT_PLUGIN_VERSION}", - "repository": self.YT_PLUGIN_REPOSITORY, - } - plugins.append(yt_plugin) + data = managed_node.generate_server_config(await self._config.yaml.all()) with open(self.lavalink_app_yml, "w", encoding="utf-8") as f: yaml.safe_dump(data, f) @@ -584,7 +377,8 @@ async def _download_jar(self) -> None: # A 404 means our LAVALINK_DOWNLOAD_URL is invalid, so likely the jar version # hasn't been published yet raise LavalinkDownloadFailed( - f"Lavalink jar version {self.JAR_VERSION} hasn't been published yet", + f"Lavalink jar version {managed_node.JAR_VERSION}" + " hasn't been published yet", response=response, should_retry=False, ) @@ -670,7 +464,7 @@ async def _is_up_to_date(self): self._jvm = java["jvm"].decode() self._lavaplayer = lavaplayer["lavaplayer"].decode() self._buildtime = date - self._up_to_date = self._lavalink_version >= self.JAR_VERSION + self._up_to_date = self._lavalink_version >= managed_node.JAR_VERSION return self._up_to_date async def maybe_download_jar(self): @@ -690,7 +484,7 @@ async def maybe_download_jar(self): log.info( "Lavalink version outdated, triggering update from %s to %s...", self._lavalink_version, - self.JAR_VERSION, + managed_node.JAR_VERSION, ) await self._download_jar() diff --git a/redbot/cogs/audio/utils.py b/redbot/cogs/audio/utils.py index d813fec09f4..83a3ffe8bc0 100644 --- a/redbot/cogs/audio/utils.py +++ b/redbot/cogs/audio/utils.py @@ -18,6 +18,8 @@ from redbot.core.bot import Red from redbot.core.i18n import Translator +from .managed_node.ll_server_config import DEFAULT_LAVALINK_YAML, change_dict_naming_convention + log = getLogger("red.cogs.Audio.task.callback") _ = Translator("Audio", Path(__file__)) @@ -54,55 +56,6 @@ def get_jar_ram_defaults() -> Tuple[str, str]: MIN_JAVA_RAM, MAX_JAVA_RAM = get_jar_ram_defaults() -DEFAULT_LAVALINK_YAML = { - # The nesting structure of this dict is very important, it's a 1:1 mirror of application.yaml in JSON - "yaml__server__address": "localhost", - "yaml__server__port": 2333, - "yaml__lavalink__server__password": "youshallnotpass", - "yaml__lavalink__server__sources__http": True, - "yaml__lavalink__server__sources__bandcamp": True, - "yaml__lavalink__server__sources__local": True, - "yaml__lavalink__server__sources__soundcloud": True, - "yaml__lavalink__server__sources__youtube": True, - "yaml__lavalink__server__sources__twitch": True, - "yaml__lavalink__server__sources__vimeo": True, - "yaml__lavalink__server__bufferDurationMs": 400, - "yaml__lavalink__server__frameBufferDurationMs": 1000, - # 100 pages - 100 entries per page = 10,000 tracks which is the Audio Limit for a single playlist. - "yaml__lavalink__server__youtubePlaylistLoadLimit": 100, - "yaml__lavalink__server__playerUpdateInterval": 1, - "yaml__lavalink__server__youtubeSearchEnabled": True, - "yaml__lavalink__server__soundcloudSearchEnabled": True, - "yaml__lavalink__server__gc_warnings": True, - "yaml__metrics__prometheus__enabled": False, - "yaml__metrics__prometheus__endpoint": "/metrics", - "yaml__sentry__dsn": "", - "yaml__sentry__environment": "", - "yaml__logging__file__path": "./logs/", - "yaml__logging__level__root": "INFO", - "yaml__logging__level__lavalink": "INFO", - "yaml__logging__logback__rollingpolicy__max_history": 15, - "yaml__logging__logback__rollingpolicy__max_size": "10MB", - # plugin configuration - note that the plugin may be disabled by the manager - "yaml__plugins__youtube__enabled": True, - "yaml__plugins__youtube__allowSearch": True, - "yaml__plugins__youtube__allowDirectVideoIds": True, - "yaml__plugins__youtube__allowDirectPlaylistIds": True, - "yaml__plugins__youtube__clients": [ - "MUSIC", - "WEB", - "ANDROID_TESTSUITE", - "TVHTML5EMBEDDED", - "ANDROID_LITE", - "MEDIA_CONNECT", - "IOS", - ], - "yaml__plugins__youtube__WEB__playback": True, - "yaml__plugins__youtube__TVHTML5EMBEDDED__playlistLoading": False, - "yaml__plugins__youtube__TVHTML5EMBEDDED__videoLoading": False, - "yaml__plugins__youtube__TVHTML5EMBEDDED__searching": False, -} - DEFAULT_LAVALINK_SETTINGS = { "host": DEFAULT_LAVALINK_YAML["yaml__server__address"], "rest_port": DEFAULT_LAVALINK_YAML["yaml__server__port"], @@ -122,24 +75,6 @@ def sizeof_fmt(num: Union[float, int]) -> str: return f"{num:.1f}Y" -# This assumes all keys with `_` should be converted from `part1_part2` to `part1-part2` -def convert_function(key: str) -> str: - return key.replace("_", "-") - - -def change_dict_naming_convention(data) -> dict: - ret: Any = data - if isinstance(data, dict): - ret = {} - for key, value in data.items(): - ret[convert_function(key)] = change_dict_naming_convention(value) - elif isinstance(data, list): - ret = [] - for value in data: - ret.append(change_dict_naming_convention(value)) - return ret - - class CacheLevel: __slots__ = ("value",) diff --git a/redbot/cogs/trivia/data/lists/worldcup.yaml b/redbot/cogs/trivia/data/lists/worldcup.yaml index 24f7e345056..918e024b851 100644 --- a/redbot/cogs/trivia/data/lists/worldcup.yaml +++ b/redbot/cogs/trivia/data/lists/worldcup.yaml @@ -637,16 +637,16 @@ Who won the Golden Boot award in 2022 Qatar?: # Golden Glove -Who won the Golden Boot award in 2010 South Africa?: +Who won the Golden Glove award in 2010 South Africa?: - Iker Casillas - Casillas -Who won the Golden Boot award in 2014 Brazil?: +Who won the Golden Glove award in 2014 Brazil?: - Manuel Neuer - Neuer -Who won the Golden Boot award in 2018 Russia?: +Who won the Golden Glove award in 2018 Russia?: - Thibaut Courtois - Courtois -Who won the Golden Boot award in 2022 Qatar?: +Who won the Golden Glove award in 2022 Qatar?: - Emiliano Martínez - Martínez - Martinez diff --git a/requirements/base.txt b/requirements/base.txt index 692480ce4da..758bbd96362 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -8,11 +8,11 @@ aiohttp-json-rpc==0.13.3 # via -r base.in aiosignal==1.3.1 # via aiohttp -apsw==3.46.0.1 +apsw==3.46.1.0 # via -r base.in -attrs==24.1.0 +attrs==24.2.0 # via aiohttp -babel==2.15.0 +babel==2.16.0 # via -r base.in brotli==1.1.0 # via -r base.in @@ -26,9 +26,9 @@ frozenlist==1.4.1 # via # aiohttp # aiosignal -idna==3.7 +idna==3.8 # via yarl -markdown==3.6 +markdown==3.7 # via -r base.in markdown-it-py==3.0.0 # via rich @@ -38,7 +38,7 @@ multidict==6.0.5 # via # aiohttp # yarl -orjson==3.10.6 +orjson==3.10.7 # via -r base.in packaging==24.1 # via -r base.in @@ -50,9 +50,9 @@ pygments==2.18.0 # via rich python-dateutil==2.9.0.post0 # via -r base.in -pyyaml==6.0.1 +pyyaml==6.0.2 # via -r base.in -rapidfuzz==3.9.5 +rapidfuzz==3.9.6 # via -r base.in red-commons==1.0.0 # via @@ -60,7 +60,7 @@ red-commons==1.0.0 # red-lavalink red-lavalink==0.11.0 # via -r base.in -rich==13.7.1 +rich==13.8.0 # via -r base.in schema==0.7.7 # via -r base.in @@ -80,11 +80,11 @@ colorama==0.4.6; sys_platform == "win32" # via click distro==1.9.0; sys_platform == "linux" and sys_platform == "linux" # via -r base.in -importlib-metadata==8.2.0; python_version != "3.10" and python_version != "3.11" +importlib-metadata==8.4.0; python_version != "3.10" and python_version != "3.11" # via markdown pytz==2024.1; python_version == "3.8" # via babel -uvloop==0.19.0; (sys_platform != "win32" and platform_python_implementation == "CPython") and sys_platform != "win32" +uvloop==0.20.0; (sys_platform != "win32" and platform_python_implementation == "CPython") and sys_platform != "win32" # via -r base.in -zipp==3.19.2; python_version != "3.10" and python_version != "3.11" +zipp==3.20.1; python_version != "3.10" and python_version != "3.11" # via importlib-metadata diff --git a/requirements/extra-doc.txt b/requirements/extra-doc.txt index a88f46bf96c..2153a9b05f4 100644 --- a/requirements/extra-doc.txt +++ b/requirements/extra-doc.txt @@ -11,7 +11,7 @@ docutils==0.20.1 # sphinx-rtd-theme imagesize==1.4.1 # via sphinx -importlib-metadata==8.2.0 +importlib-metadata==8.4.0 # via # -c base.txt # sphinx @@ -56,7 +56,7 @@ sphinxcontrib-trio==1.1.2 # via -r extra-doc.in urllib3==2.2.2 # via requests -zipp==3.19.2 +zipp==3.20.1 # via # -c base.txt # importlib-metadata diff --git a/requirements/extra-test.txt b/requirements/extra-test.txt index ede0d9e60b0..5dfa3919baf 100644 --- a/requirements/extra-test.txt +++ b/requirements/extra-test.txt @@ -21,7 +21,7 @@ pytest-asyncio==0.21.2 # via -r extra-test.in pytest-mock==3.14.0 # via -r extra-test.in -tomlkit==0.13.0 +tomlkit==0.13.2 # via pylint exceptiongroup==1.2.2; python_version != "3.11" # via pytest diff --git a/tests/cogs/audio/test_manager.py b/tests/cogs/audio/managed_node/test_ll_version.py similarity index 98% rename from tests/cogs/audio/test_manager.py rename to tests/cogs/audio/managed_node/test_ll_version.py index 25deb8062ae..eedfa362a75 100644 --- a/tests/cogs/audio/test_manager.py +++ b/tests/cogs/audio/managed_node/test_ll_version.py @@ -3,7 +3,7 @@ import pytest -from redbot.cogs.audio.manager import LavalinkOldVersion, LavalinkVersion +from redbot.cogs.audio.managed_node.ll_version import LavalinkOldVersion, LavalinkVersion ORDERED_VERSIONS = [