funkwhale issueshttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues2024-03-29T08:33:30Zhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2265Dependency Dashboard2024-03-29T08:33:30ZRenovateBotDependency DashboardThis issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more.
## Rate-Limited
These updates are currently rate-limited. Click on a...This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more.
## Rate-Limited
These updates are currently rate-limited. Click on a checkbox below to force their creation now.
- [ ] <!-- unlimit-branch=renovate/stable-api-django-3.x -->chore(api): update dependency django to v3.2.25 (stable)
- [ ] <!-- unlimit-branch=renovate/stable-docs-django-3.x -->chore(docs): update dependency django to v3.2.25 (stable)
- [ ] <!-- unlimit-branch=renovate/stable-front-dompurify-2.x -->chore(front): update dependency dompurify to v2.4.9 (stable)
- [ ] <!-- unlimit-branch=renovate/stable-front-standardized-audio-context-25.x -->chore(front): update dependency standardized-audio-context to v25.3.67 (stable)
- [ ] <!-- unlimit-branch=renovate/stable-front-vue-upload-component-3.x -->chore(front): update dependency vue-upload-component to v3.1.15 (stable)
- [ ] <!-- unlimit-branch=renovate/stable-api-lock-file-maintenance -->chore(api): lock file maintenance (stable)
- [ ] <!-- unlimit-branch=renovate/stable-docs-lock-file-maintenance -->chore(docs): lock file maintenance (stable)
- [ ] <!-- unlimit-branch=renovate/stable-front-lock-file-maintenance -->chore(front): lock file maintenance (stable)
- [ ] <!-- unlimit-branch=renovate/stable-lock-file-maintenance -->chore: lock file maintenance (stable)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-filter-24.x -->chore(api): update dependency django-filter to v24 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-faker-24.x -->chore(api): update dependency faker to v24 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-cov-5.x -->chore(api): update dependency pytest-cov to v5 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-intlify-unplugin-vue-i18n-4.x -->chore(front): update dependency @intlify/unplugin-vue-i18n to v4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-eslint-config-typescript-13.x -->chore(front): update dependency @vue/eslint-config-typescript to v13 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-universal-cookie-7.x -->chore(front): update dependency universal-cookie to v7 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-tsc-2.x -->chore(front): update dependency vue-tsc to v2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-major-workbox-monorepo -->chore(front): update workbox monorepo to v7 (develop) (major) (`workbox-core`, `workbox-precaching`, `workbox-routing`, `workbox-strategies`)
- [ ] <!-- unlimit-branch=renovate/develop-pytest-8.x -->chore: update dependency pytest to v8 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-docker-26.x -->chore: update docker docker tag to v26 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-postgres-16.x -->chore: update postgres docker tag to v16 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-psf-black-24.x -->chore: update pre-commit hook psf/black to v24 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-pycqa-flake8-7.x -->chore: update pre-commit hook pycqa/flake8 to v7 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-arrow-1.x -->chore(api): update dependency arrow to v1.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-black-24.x -->chore(api): update dependency black to v24.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-boto3-1.x -->chore(api): update dependency boto3 to v1.34.73 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-channels -->chore(api): update dependency channels-redis to v4.2.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-debugpy-1.x -->chore(api): update dependency debugpy to v1.8.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-allauth-0.x -->chore(api): update dependency django-allauth to v0.61.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-auth-ldap-4.x -->chore(api): update dependency django-auth-ldap to v4.7.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-cache-memoize-0.x -->chore(api): update dependency django-cache-memoize to v0.2.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-coverage-plugin-3.x -->chore(api): update dependency django-coverage-plugin to v3.1.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-debug-toolbar-4.x -->chore(api): update dependency django-debug-toolbar to v4.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-dynamic-preferences-1.x -->chore(api): update dependency django-dynamic-preferences to v1.16.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-environ-0.x -->chore(api): update dependency django-environ to v0.11.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-oauth-toolkit-2.x -->chore(api): update dependency django-oauth-toolkit to v2.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-redis-5.x -->chore(api): update dependency django-redis to v5.4.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-storages-1.x -->chore(api): update dependency django-storages to v1.14.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-djangorestframework-3.x -->chore(api): update dependency djangorestframework to v3.15.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-drf-spectacular-0.x -->chore(api): update dependency drf-spectacular to v0.27.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-factory-boy-3.x -->chore(api): update dependency factory-boy to v3.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-faker-23.x -->chore(api): update dependency faker to v23.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-ipython-8.x -->chore(api): update dependency ipython to v8.22.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-markdown-3.x -->chore(api): update dependency markdown to v3.6 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-mutagen-1.x -->chore(api): update dependency mutagen to v1.47.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pylint-3.x -->chore(api): update dependency pylint to v3.1.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-8.x -->chore(api): update dependency pytest to v8.1.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-asyncio-0.x -->chore(api): update dependency pytest-asyncio to v0.23.6 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-cov-4.x -->chore(api): update dependency pytest-cov to v4.1.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-django-4.x -->chore(api): update dependency pytest-django to v4.8.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-mock-3.x -->chore(api): update dependency pytest-mock to v3.14.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pytest-randomly-3.x -->chore(api): update dependency pytest-randomly to v3.15.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-requests-mock-1.x -->chore(api): update dependency requests-mock to v1.12.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-sentry-sdk-1.x -->chore(api): update dependency sentry-sdk to v1.44.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-troi-2024.x -->chore(api): update dependency troi to v2024.2.9.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-typesense-0.x -->chore(api): update dependency typesense to v0.19.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-uvicorn-0.x -->chore(api): update dependency uvicorn to v0.29.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-funkwhale-ui-0.x -->chore(front): update dependency @funkwhale/ui to v0.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-typescript-eslint-monorepo -->chore(front): update dependency @typescript-eslint/eslint-plugin to v7.4.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-macros-volar-0.x -->chore(front): update dependency @vue-macros/volar to v0.18.16 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-test-utils-2.x -->chore(front): update dependency @vue/test-utils to v2.4.5 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-axios-1.x -->chore(front): update dependency axios to v1.6.8 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-cypress-13.x -->chore(front): update dependency cypress to v13.7.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-diff-5.x -->chore(front): update dependency diff to v5.2.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-eslint-plugin-vue-9.x -->chore(front): update dependency eslint-plugin-vue to v9.24.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-focus-trap-7.x -->chore(front): update dependency focus-trap to v7.5.4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-moment-2.x -->chore(front): update dependency moment to v2.30.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-rollup-plugin-visualizer-5.x -->chore(front): update dependency rollup-plugin-visualizer to v5.12.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-sass-1.x -->chore(front): update dependency sass to v1.72.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-sinon-15.x -->chore(front): update dependency sinon to v15.2.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-standardized-audio-context-mock-9.x -->chore(front): update dependency standardized-audio-context-mock to v9.7.3 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-typescript-5.x -->chore(front): update dependency typescript to v5.4.3 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-unplugin-vue-macros-2.x -->chore(front): update dependency unplugin-vue-macros to v2.8.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-utility-types-3.x -->chore(front): update dependency utility-types to v3.11.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vite-5.x -->chore(front): update dependency vite to v5.2.7 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vite-plugin-pwa-0.x -->chore(front): update dependency vite-plugin-pwa to v0.19.7 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-i18n-9.x -->chore(front): update dependency vue-i18n to v9.10.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-router-4.x -->chore(front): update dependency vue-router to v4.3.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue3-gettext-2.x -->chore(front): update dependency vue3-gettext to v2.4.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-nginx-1.x -->chore(front): update nginx docker tag to v1.25.4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-sentry-javascript-monorepo -->chore(front): update sentry-javascript monorepo to v7.109.0 (develop) (`@sentry/tracing`, `@sentry/vue`)
- [ ] <!-- unlimit-branch=renovate/develop-front-vitest-monorepo -->chore(front): update vitest monorepo to v1.4.0 (develop) (`@vitest/coverage-v8`, `vitest`)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-monorepo -->chore(front): update vue monorepo to v3.4.21 (develop) (`@vue/compiler-sfc`, `@vue/runtime-core`, `vue`)
- [ ] <!-- unlimit-branch=renovate/develop-front-vueuse -->chore(front): update vueuse to v10.9.0 (develop) (`@vueuse/core`, `@vueuse/integrations`, `@vueuse/math`, `@vueuse/router`)
- [ ] <!-- unlimit-branch=renovate/develop-front-workbox-monorepo -->chore(front): update workbox monorepo to v6.6.0 (develop) (`workbox-core`, `workbox-precaching`, `workbox-routing`, `workbox-strategies`)
- [ ] <!-- unlimit-branch=renovate/develop-cypress-included-13.x -->chore: update cypress/included docker tag to v13.7.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-pytest-7.x -->chore: update dependency pytest to v7.4.4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-asottile-pyupgrade-3.x -->chore: update pre-commit hook asottile/pyupgrade to v3.15.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-pre-commit-mirrors-prettier-3.x -->chore: update pre-commit hook pre-commit/mirrors-prettier to v3.1.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-pre-commit-pre-commit-hooks-4.x -->chore: update pre-commit hook pre-commit/pre-commit-hooks to v4.5.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-psf-black-23.x -->chore: update pre-commit hook psf/black to v23.12.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-pycqa-isort-5.x -->chore: update pre-commit hook pycqa/isort to v5.13.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-python-poetry-poetry-1.x -->chore: update pre-commit hook python-poetry/poetry to v1.8.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-python-3.x -->chore: update python docker tag to v3.12 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-typesense-typesense-0.x -->chore: update typesense/typesense docker tag to v0.25.2 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pin-dependencies -->chore(api): pin dependency poetry-core to ==1.9.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-docs-pin-dependencies -->chore(docs): pin dependency poetry-core to ==1.9.0 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-pin-dependencies -->chore: pin dependencies (develop) (`color-eyre`, `poetry-core`, `serde`, `serde_json`, `tauri`, `tauri-build`)
- [ ] <!-- unlimit-branch=renovate/develop-api-aiohttp-3.x -->chore(api): update dependency aiohttp to v3.9.3 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-coverage-7.x -->chore(api): update dependency coverage to v7.4.4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-django-4.x -->chore(api): update dependency django to v4.2.11 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-feedparser-6.x -->chore(api): update dependency feedparser to v6.0.11 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-kombu-5.x -->chore(api): update dependency kombu to v5.3.6 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-lb-matching-tools-2024.x -->chore(api): update dependency lb-matching-tools to v2024.1.30.1 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-prompt-toolkit-3.x -->chore(api): update dependency prompt-toolkit to v3.0.43 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-pyld-2.x -->chore(api): update dependency pyld to v2.0.4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-redis-5.x -->chore(api): update dependency redis to v5.0.3 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-api-unidecode-1.x -->chore(api): update dependency unidecode to v1.3.8 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-docs-django-3.x -->chore(docs): update dependency django to v3.2.25 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-qs-6.x -->chore(front): update dependency @types/qs to v6.9.14 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vitejs-plugin-vue-5.x -->chore(front): update dependency @vitejs/plugin-vue to v5.0.4 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-dompurify-3.x -->chore(front): update dependency dompurify to v3.0.11 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-msw-2.x -->chore(front): update dependency msw to v2.2.13 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-standardized-audio-context-25.x -->chore(front): update dependency standardized-audio-context to v25.3.67 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-vue-upload-component-3.x -->chore(front): update dependency vue-upload-component to v3.1.15 (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-tauri-monorepo -->chore(front): update tauri monorepo (develop) (`@tauri-apps/api`, `@tauri-apps/cli`)
- [ ] <!-- unlimit-branch=renovate/develop-api-lock-file-maintenance -->chore(api): lock file maintenance (develop)
- [ ] <!-- unlimit-branch=renovate/develop-docs-lock-file-maintenance -->chore(docs): lock file maintenance (develop)
- [ ] <!-- unlimit-branch=renovate/develop-front-lock-file-maintenance -->chore(front): lock file maintenance (develop)
- [ ] <!-- unlimit-branch=renovate/develop-lock-file-maintenance -->chore: lock file maintenance (develop)
- [ ] <!-- create-all-rate-limited-prs -->🔐 **Create all rate-limited MRs at once** 🔐
## Open
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
- [ ] <!-- rebase-branch=renovate/develop-front-sinon-17.x -->[chore(front): update dependency sinon to v17 (develop)](!2770)
## Ignored or Blocked
These are blocked by an existing closed MR and will not be recreated unless you click a checkbox below.
- [ ] <!-- recreate-branch=renovate/develop-api-cryptography-42.x -->[chore(api): update dependency cryptography to v42 (develop)](!2707)
- [ ] <!-- recreate-branch=renovate/develop-api-django-5.x -->[chore(api): update dependency django to v5 (develop)](!2708)
- [ ] <!-- recreate-branch=renovate/develop-api-flake8-7.x -->[chore(api): update dependency flake8 to v7 (develop)](!2726)
- [ ] <!-- recreate-branch=renovate/develop-docs-django-5.x -->[chore(docs): update dependency django to v5 (develop)](!2738)
## Detected dependencies
<details><summary>Branch stable</summary>
<blockquote>
<details><summary>docker-compose</summary>
<blockquote>
<details><summary>.gitpod/docker-compose.yml</summary>
- `postgres 15-alpine`
- `redis 7-alpine`
</details>
<details><summary>deploy/docker-compose.yml</summary>
- `postgres 15-alpine`
- `redis 7-alpine`
- `typesense/typesense 0.24.0`
</details>
</blockquote>
</details>
<details><summary>dockerfile</summary>
<blockquote>
<details><summary>.gitpod/Dockerfile</summary>
- `gitpod/workspace-full 2023-10-25-20-43-33`
</details>
<details><summary>api/Dockerfile</summary>
- `alpine 3.17`
- `alpine 3.17`
- `alpine 3.17`
</details>
<details><summary>front/Dockerfile</summary>
- `node 18-alpine`
- `nginx 1.23.4-alpine`
</details>
<details><summary>front/Dockerfile.dev</summary>
- `node 18-alpine`
</details>
</blockquote>
</details>
<details><summary>gitlabci</summary>
<blockquote>
<details><summary>.gitlab-ci.yml</summary>
- `python 3.11`
- `postgres 15-alpine`
- `redis 7-alpine`
- `cypress/included 12.14.0`
- `postgres 15-alpine`
- `redis 7-alpine`
- `docker 20-dind`
</details>
</blockquote>
</details>
<details><summary>gitlabci-include</summary>
<blockquote>
<details><summary>.gitlab-ci.yml</summary>
</details>
</blockquote>
</details>
<details><summary>npm</summary>
<blockquote>
<details><summary>front/package.json</summary>
- `@funkwhale/ui 0.2.2`
- `@sentry/tracing 7.47.0`
- `@sentry/vue 7.47.0`
- `@vue/runtime-core 3.3.11`
- `@vueuse/core 10.3.0`
- `@vueuse/integrations 10.3.0`
- `@vueuse/math 10.3.0`
- `@vueuse/router 10.3.0`
- `axios 1.2.3`
- `axios-auth-refresh 3.3.6`
- `butterchurn 3.0.0-beta.4`
- `butterchurn-presets 3.0.0-beta.4`
- `diff 5.1.0`
- `dompurify 2.4.7`
- `focus-trap 7.2.0`
- `fomantic-ui-css 2.9.3`
- `idb-keyval 6.2.1`
- `lodash-es 4.17.21`
- `lru-cache 7.14.1`
- `moment 2.29.4`
- `showdown 2.1.0`
- `stacktrace-js 2.0.2`
- `standardized-audio-context 25.3.64`
- `text-clipper 2.2.0`
- `transliteration 2.3.5`
- `universal-cookie 4.0.4`
- `vue 3.3.11`
- `vue-gettext 2.1.12`
- `vue-i18n 9.3.0-beta.19`
- `vue-router 4.2.5`
- `vue-upload-component 3.1.8`
- `vue-virtual-scroller 2.0.0-beta.8`
- `vue3-gettext 2.3.4`
- `vue3-lazyload 0.3.8`
- `vuedraggable 4.1.0`
- `vuex 4.1.0`
- `vuex-persistedstate 4.1.0`
- `vuex-router-sync 5.0.0`
</details>
</blockquote>
</details>
<details><summary>pep621</summary>
<blockquote>
<details><summary>api/pyproject.toml</summary>
- `poetry-core ==1.8.1`
</details>
<details><summary>docs/pyproject.toml</summary>
- `poetry-core ==1.8.1`
</details>
<details><summary>scripts/pyproject.toml</summary>
- `poetry-core ==1.8.1`
</details>
</blockquote>
</details>
<details><summary>poetry</summary>
<blockquote>
<details><summary>api/pyproject.toml</summary>
- `python ^3.8,<3.12`
- `dj-rest-auth 2.2.8`
- `django ==3.2.24`
- `django-allauth ==0.42.0`
- `django-cache-memoize 0.1.10`
- `django-cacheops ==6.1`
- `django-cleanup ==6.0.0`
- `django-cors-headers ==3.13.0`
- `django-dynamic-preferences ==1.14.0`
- `django-environ ==0.10.0`
- `django-filter ==22.1`
- `django-oauth-toolkit 2.2.0`
- `django-redis ==5.2.0`
- `django-storages ==1.13.2`
- `django-versatileimagefield ==2.2`
- `djangorestframework ==3.14.0`
- `drf-spectacular ==0.26.5`
- `markdown ==3.4.4`
- `persisting-theory ==1.0`
- `psycopg2 ==2.9.9`
- `redis ==4.5.5`
- `django-auth-ldap ==4.1.0`
- `python-ldap ==3.4.4`
- `channels ==4.0.0`
- `channels-redis ==4.1.0`
- `kombu ==5.2.4`
- `celery ==5.2.7`
- `gunicorn ==20.1.0`
- `uvicorn ==0.20.0`
- `aiohttp ==3.8.6`
- `arrow ==1.2.3`
- `backports-zoneinfo ==0.2.1`
- `bleach ==5.0.1`
- `boto3 ==1.26.161`
- `click ==8.1.7`
- `cryptography ==38.0.4`
- `feedparser ==6.0.11`
- `musicbrainzngs ==0.7.1`
- `mutagen ==1.46.0`
- `pillow ==9.3.0`
- `pydub ==0.25.1`
- `pyld ==2.0.4`
- `python-magic ==0.4.27`
- `requests ==2.28.2`
- `requests-http-message-signatures ==0.3.1`
- `sentry-sdk ==1.19.1`
- `watchdog ==2.2.1`
- `unidecode ==1.3.8`
- `pycountry 22.3.5`
- `typesense ==0.15.1`
- `ipython ==7.34.0`
- `pluralizer ==1.2.0`
- `service-identity ==21.1.0`
- `unicode-slugify ==0.1.5`
- `aioresponses ==0.7.6`
- `asynctest ==0.13.0`
- `black ==23.3.0`
- `coverage ==6.5.0`
- `debugpy ==1.6.7.post1`
- `django-coverage-plugin ==3.0.0`
- `django-debug-toolbar ==3.8.1`
- `factory-boy ==3.2.1`
- `faker ==15.3.4`
- `flake8 ==3.9.2`
- `ipdb ==0.13.13`
- `pytest ==7.4.4`
- `pytest-asyncio ==0.21.0`
- `prompt-toolkit ==3.0.43`
- `pytest-cov ==4.0.0`
- `pytest-django ==4.5.2`
- `pytest-env ==0.8.2`
- `pytest-mock ==3.10.0`
- `pytest-randomly ==3.12.0`
- `pytest-sugar ==0.9.7`
- `requests-mock ==1.10.0`
- `pylint ==2.17.7`
- `pylint-django ==2.5.5`
- `django-extensions ==3.2.3`
</details>
<details><summary>docs/pyproject.toml</summary>
- `python ^3.8`
- `sphinx ==5.3.0`
- `sphinx_design ==0.3.0`
- `sphinx-copybutton ==0.5.2`
- `sphinx-intl 2.0.1`
- `sphinx-rtd-theme ==1.1.1`
- `sphinxcontrib-mermaid 0.7.1`
- `myst-parser 1.0.0`
- `django ==3.2.24`
- `django-environ ==0.10.0`
- `sphinx-autobuild 2021.3.14`
</details>
<details><summary>scripts/pyproject.toml</summary>
- `python ^3.8`
- `pytest 7.3.1`
</details>
</blockquote>
</details>
<details><summary>pre-commit</summary>
<blockquote>
<details><summary>.pre-commit-config.yaml</summary>
- `pre-commit/pre-commit-hooks v4.4.0`
- `python-poetry/poetry 1.5.1`
- `asottile/pyupgrade v3.9.0`
- `psf/black 23.7.0`
- `pycqa/isort 5.12.0`
- `pycqa/flake8 6.0.0`
- `pre-commit/mirrors-prettier v3.0.3`
- `codespell-project/codespell v2.2.6`
- `shellcheck-py/shellcheck-py v0.9.0.5`
</details>
</blockquote>
</details>
</blockquote>
</details>
<details><summary>Branch develop</summary>
<blockquote>
<details><summary>cargo</summary>
<blockquote>
<details><summary>front/tauri/Cargo.toml</summary>
- `serde_json 1.0`
- `serde 1.0`
- `tauri 2.0.0-beta`
- `color-eyre 0.6.2`
- `tauri-build 2.0.0-beta`
</details>
</blockquote>
</details>
<details><summary>docker-compose</summary>
<blockquote>
<details><summary>.gitpod/docker-compose.yml</summary>
- `postgres 15-alpine`
- `redis 7-alpine`
</details>
<details><summary>deploy/docker-compose.yml</summary>
- `postgres 15-alpine`
- `redis 7-alpine`
- `typesense/typesense 0.24.0`
</details>
</blockquote>
</details>
<details><summary>dockerfile</summary>
<blockquote>
<details><summary>.gitpod/Dockerfile</summary>
- `gitpod/workspace-full 2023-10-25-20-43-33`
</details>
<details><summary>api/Dockerfile</summary>
- `alpine 3.19`
- `alpine 3.19`
- `alpine 3.19`
</details>
<details><summary>front/Dockerfile</summary>
- `node 18-alpine`
- `nginx 1.23.4-alpine`
</details>
<details><summary>front/Dockerfile.dev</summary>
- `node 18-alpine`
</details>
</blockquote>
</details>
<details><summary>gitlabci</summary>
<blockquote>
<details><summary>.gitlab-ci.yml</summary>
- `python 3.11`
- `postgres 15-alpine`
- `redis 7-alpine`
- `cypress/included 13.6.4`
- `postgres 15-alpine`
- `redis 7-alpine`
- `docker 20-dind`
</details>
</blockquote>
</details>
<details><summary>gitlabci-include</summary>
<blockquote>
<details><summary>.gitlab-ci.yml</summary>
</details>
</blockquote>
</details>
<details><summary>npm</summary>
<blockquote>
<details><summary>front/package.json</summary>
- `@funkwhale/ui 0.2.2`
- `@sentry/tracing 7.47.0`
- `@sentry/vue 7.47.0`
- `@tauri-apps/api 2.0.0-beta.1`
- `@vue/runtime-core 3.3.11`
- `@vueuse/core 10.3.0`
- `@vueuse/integrations 10.3.0`
- `@vueuse/math 10.3.0`
- `@vueuse/router 10.3.0`
- `axios 1.2.3`
- `axios-auth-refresh 3.3.6`
- `butterchurn 3.0.0-beta.4`
- `butterchurn-presets 3.0.0-beta.4`
- `diff 5.1.0`
- `dompurify 3.0.8`
- `focus-trap 7.2.0`
- `fomantic-ui-css 2.9.3`
- `idb-keyval 6.2.1`
- `lodash-es 4.17.21`
- `lru-cache 10.2.0`
- `moment 2.29.4`
- `showdown 2.1.0`
- `stacktrace-js 2.0.2`
- `standardized-audio-context 25.3.60`
- `text-clipper 2.2.0`
- `transliteration 2.3.5`
- `universal-cookie 4.0.4`
- `vite-plugin-pwa 0.14.4`
- `vue 3.3.11`
- `vue-gettext 2.1.12`
- `vue-i18n 9.9.1`
- `vue-router 4.2.5`
- `vue-upload-component 3.1.8`
- `vue-virtual-scroller 2.0.0-beta.8`
- `vue3-gettext 2.3.4`
- `vue3-lazyload 0.3.8`
- `vuedraggable 4.1.0`
- `vuex 4.1.0`
- `vuex-persistedstate 4.1.0`
- `vuex-router-sync 5.0.0`
- `@faker-js/faker 8.4.1`
- `@intlify/eslint-plugin-vue-i18n 2.0.0`
- `@intlify/unplugin-vue-i18n 2.0.0`
- `@tauri-apps/cli 2.0.0-beta.2`
- `@types/diff 5.0.9`
- `@types/dompurify 3.0.5`
- `@types/jquery 3.5.29`
- `@types/lodash-es 4.17.12`
- `@types/moxios 0.4.17`
- `@types/qs 6.9.10`
- `@types/semantic-ui 2.2.9`
- `@types/showdown 2.0.6`
- `@typescript-eslint/eslint-plugin 7.1.0`
- `@vitejs/plugin-vue 5.0.3`
- `@vitest/coverage-v8 1.3.1`
- `@vue-macros/volar 0.13.3`
- `@vue/compiler-sfc 3.3.11`
- `@vue/eslint-config-standard 8.0.1`
- `@vue/eslint-config-typescript 12.0.0`
- `@vue/test-utils 2.2.7`
- `@vue/tsconfig 0.5.1`
- `cypress 13.6.4`
- `eslint 8.57.0`
- `eslint-config-standard 17.1.0`
- `eslint-plugin-html 8.0.0`
- `eslint-plugin-import 2.29.1`
- `eslint-plugin-n 16.6.2`
- `eslint-plugin-node 11.1.0`
- `eslint-plugin-promise 6.1.1`
- `eslint-plugin-vue 9.22.0`
- `jsdom 24.0.0`
- `jsonc-eslint-parser 2.4.0`
- `msw 2.2.1`
- `msw-auto-mock 0.18.0`
- `patch-package 8.0.0`
- `rollup-plugin-visualizer 5.9.0`
- `sass 1.57.1`
- `sinon 15.0.2`
- `standardized-audio-context-mock 9.6.32`
- `typescript 5.3.3`
- `unplugin-vue-macros 2.4.6`
- `utility-types 3.10.0`
- `vite 5.1.3`
- `vitest 1.3.1`
- `vue-tsc 1.8.27`
- `workbox-core 6.5.4`
- `workbox-precaching 6.5.4`
- `workbox-routing 6.5.4`
- `workbox-strategies 6.5.4`
</details>
</blockquote>
</details>
<details><summary>pep621</summary>
<blockquote>
<details><summary>api/pyproject.toml</summary>
- `poetry-core >=1.0.0`
</details>
<details><summary>docs/pyproject.toml</summary>
- `poetry-core >=1.0.0`
</details>
<details><summary>scripts/pyproject.toml</summary>
- `poetry-core >=1.0.0`
</details>
</blockquote>
</details>
<details><summary>poetry</summary>
<blockquote>
<details><summary>api/pyproject.toml</summary>
- `python ^3.8,<3.13`
- `dj-rest-auth 5.0.2`
- `django 4.2.9`
- `django-allauth 0.55.2`
- `django-cache-memoize 0.1.10`
- `django-cacheops ==7.0.2`
- `django-cleanup ==8.1.0`
- `django-cors-headers ==4.3.1`
- `django-dynamic-preferences ==1.14.0`
- `django-environ ==0.10.0`
- `django-filter ==23.5`
- `django-oauth-toolkit 2.2.0`
- `django-redis ==5.2.0`
- `django-storages ==1.13.2`
- `django-versatileimagefield ==3.1`
- `djangorestframework ==3.14.0`
- `drf-spectacular ==0.26.5`
- `markdown ==3.4.4`
- `persisting-theory ==1.0`
- `psycopg2 ==2.9.9`
- `redis ==5.0.1`
- `django-auth-ldap ==4.1.0`
- `python-ldap ==3.4.4`
- `channels ==4.0.0`
- `channels-redis ==4.1.0`
- `kombu 5.3.4`
- `celery 5.3.6`
- `gunicorn ==21.2.0`
- `uvicorn ==0.20.0`
- `aiohttp 3.9.1`
- `arrow ==1.2.3`
- `backports-zoneinfo ==0.2.1`
- `bleach ==6.1.0`
- `boto3 ==1.26.161`
- `click ==8.1.7`
- `cryptography ==41.0.7`
- `feedparser ==6.0.10`
- `liblistenbrainz ==0.5.5`
- `musicbrainzngs ==0.7.1`
- `mutagen ==1.46.0`
- `pillow ==10.2.0`
- `pydub ==0.25.1`
- `pyld ==2.0.3`
- `python-magic ==0.4.27`
- `requests ==2.31.0`
- `requests-http-message-signatures ==0.3.1`
- `sentry-sdk ==1.19.1`
- `watchdog ==4.0.0`
- `troi ==2024.1.26.0`
- `lb-matching-tools ==2024.1.25.0rc1`
- `unidecode ==1.3.7`
- `pycountry 23.12.11`
- `typesense ==0.15.1`
- `ipython ==8.12.3`
- `pluralizer ==1.2.0`
- `service-identity ==24.1.0`
- `unicode-slugify ==0.1.5`
- `aioresponses ==0.7.6`
- `asynctest ==0.13.0`
- `black ==24.1.1`
- `coverage ==7.4.1`
- `debugpy ==1.6.7.post1`
- `django-coverage-plugin ==3.0.0`
- `django-debug-toolbar ==4.2.0`
- `factory-boy ==3.2.1`
- `faker ==23.2.1`
- `flake8 ==3.9.2`
- `ipdb ==0.13.13`
- `pytest ==8.0.0`
- `pytest-asyncio ==0.21.0`
- `prompt-toolkit ==3.0.41`
- `pytest-cov ==4.0.0`
- `pytest-django ==4.5.2`
- `pytest-env ==1.1.3`
- `pytest-mock ==3.10.0`
- `pytest-randomly ==3.12.0`
- `pytest-sugar ==1.0.0`
- `requests-mock ==1.10.0`
- `pylint ==3.0.3`
- `pylint-django ==2.5.5`
- `django-extensions ==3.2.3`
</details>
<details><summary>docs/pyproject.toml</summary>
- `python ^3.9`
- `sphinx 7.2.6`
- `sphinx_design 0.5.0`
- `sphinx-copybutton ==0.5.2`
- `sphinx-intl 2.1.0`
- `sphinx-rtd-theme ==2.0.0`
- `sphinxcontrib-mermaid 0.9.2`
- `myst-parser 2.0.0`
- `django-environ ==0.11.2`
- `django ==3.2.23`
- `sphinx-autobuild 2024.2.4`
</details>
<details><summary>scripts/pyproject.toml</summary>
- `python ^3.8`
- `pytest 7.3.1`
</details>
</blockquote>
</details>
<details><summary>pre-commit</summary>
<blockquote>
<details><summary>.pre-commit-config.yaml</summary>
- `pre-commit/pre-commit-hooks v4.4.0`
- `python-poetry/poetry 1.5.1`
- `asottile/pyupgrade v3.9.0`
- `psf/black 23.7.0`
- `pycqa/isort 5.12.0`
- `pycqa/flake8 6.1.0`
- `pre-commit/mirrors-prettier v3.0.3`
- `codespell-project/codespell v2.2.6`
- `shellcheck-py/shellcheck-py v0.9.0.5`
</details>
</blockquote>
</details>
</blockquote>
</details>https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1810I-5 Following other fw users2024-03-28T23:52:24ZpetitminionI-5 Following other fw users# Meta
- Specification: https://docs.funkwhale.audio/develop/specs/user-follow/index.html
- design : https://design.funkwhale.audio/#/view/e3a187f0-0f5e-11ed-adb9-fff9e854a67c?page-id=e61451a5-6d56-8015-8003-c3dd410c8f50&section=interac...# Meta
- Specification: https://docs.funkwhale.audio/develop/specs/user-follow/index.html
- design : https://design.funkwhale.audio/#/view/e3a187f0-0f5e-11ed-adb9-fff9e854a67c?page-id=e61451a5-6d56-8015-8003-c3dd410c8f50§ion=interactions&frame-id=13bd6d1c-f5ce-8074-8003-b82e985e419d&index=0&share-id=a4e0101a-252c-80ef-8003-c7c73d99d4b7petitminionpetitminionhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1568III-2 Supporting multi-artist tracks/albums2024-03-28T23:49:49ZFacinorousIII-2 Supporting multi-artist tracks/albums<!--
Hi there! You are about to share feature request or an idea, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure yo...<!--
Hi there! You are about to share feature request or an idea, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure your issue respect our guidelines.
To ensure we can deal with your idea or request, please try to stick
to the following structure. You can leave the parts text between `<!- ->`
markers untouched, they won't be displayed in your final message.
Please do not edit the following line, it's used for automatic classification
-->
## Meta
Spec: https://docs.funkwhale.audio/develop/specs/multi-artist/index.html
## What is the problem you are facing?
<!--
Describe the problem you'd like to solve, and why we need to add or
improve something in the current system to solve that problem.
Be as specific as possible.
-->
I have been having this issue with how the UI shows songs with Metadata with multiple artists tagged by MusicBrainz.
After discussing it in the Element chat I wrote down how I expect multiple artists to work inside the Funkwhale UI.
Note, I get these expectations from music streaming platforms that already exist like YouTube Music and Spotify, and this is where I will be pulling my examples from.
My issue with using Funkwhale, and why I currently have stopped using my instance, is due to the fact when I scan my library where a music file looks like this (tagged from MusicBrainz:)
![06-22-2021-s9ByEXGfd2](/uploads/b2e1b9abf675e49692d698a25d19616b/06-22-2021-s9ByEXGfd2.png)
It gets added to my Funkwhale under the artist "WifiIsFuneral/HenryDaher" and there is no complete album named "When Hell Falls" which is the whole album with tracks 1-12. Only multiple albums show up based on the Contributing Artists tag in the song file.
![06-22-2021-g3V9mL9DSt](/uploads/99e89cc9ed99be3779de98e1af93f725/06-22-2021-g3V9mL9DSt.png)
Because of this, it's causing my entire library to look insanely messy as a lot of hip hop albums have Contributing artists so instead of a library filled with organized albums I'm getting a library filled with albums which contain 1 song, similar to the above picture.
What I expect to see, is the song be contained under the album When Hell Falls, which is owned by WifiIsFuneral (so should be under his artist page) and inside that album show that the song is featuring the Contributing artist. This is how it looks on YouTube music:
![Screenshot_20210909-073836_YouTube_Music](/uploads/309771cceb6b88877e268e98a8fa6e87/Screenshot_20210909-073836_YouTube_Music.jpg)
As you can see, album is listed to be owned by WifiIsFuneral. The song I showed in my library above is using the Album Artist tag to show who owns the song in the album, adding the contributing artist to the song file name.
If you go to HenryDaher in YouTube music, ou do not see this album, as it is not his album.
![Screenshot_20210909-073904_YouTube_Music](/uploads/7454c467f87f73f8c3dcf475e8e6a5eb/Screenshot_20210909-073904_YouTube_Music.jpg)
___
Now that is albums. Singles should be handled differently, in my opinion. As they are on these streaming services as well.
Singles are shown on BOTH artist pages for each Contributing artist. Let's take the new song Family Ties by baby keem for example in this.
![Screenshot_20210909-072642_YouTube_Music](/uploads/053006f37d0f1c3787bf626d8ec76354/Screenshot_20210909-072642_YouTube_Music.jpg)
As you can see in this picture, the song shows up on Baby Keems profile as a single by Baby Keem.
Go to Kendrick Lamars profile and you see the same thing,
![Screenshot_20210909-072650_YouTube_Music](/uploads/2eec0bac2a447d88d75080475144a612/Screenshot_20210909-072650_YouTube_Music.jpg)
Though when clicking that single on either profile, it brings you to the same song which shows more info about the track. How Baby Keem is the one who made the song, and how Kendrick Lamar is featured on it.
![Screenshot_20210909-072725_YouTube_Music](/uploads/16771febe297bcbfbd386d4d06187da9/Screenshot_20210909-072725_YouTube_Music.jpg)
This is how I expected Funkwhale to organize its media as well, so after finding out about the way it deals with Contributing artists really threw me off. I feel the way these popular streaming services sort their music is very intuitive and easy to browse meanwhile keeping everything looking organized.
TLDR:
I think songs in **albums** and **eps** should be organized by albumartist, so they only show up under the artist who made them but then in the album view it will show the Contributing Artists as a field.
And I think **singles** should be organized by ContributingArtists, so they show up under both artist profiles but link to the same song page.petitminionpetitminionhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1315Does not show follower-requests2024-03-27T15:46:34ZxundeenergieDoes not show follower-requests## Steps to reproduce
1. Go to mastodon or Pleroma, search for @user@yourfunkwhale.instance, choose user, klick "Follow"
2. Go to funkwhaleinstance, check notifications, check settings->user-requests
3. Go to https://<funkwhaleinstance>/...## Steps to reproduce
1. Go to mastodon or Pleroma, search for @user@yourfunkwhale.instance, choose user, klick "Follow"
2. Go to funkwhaleinstance, check notifications, check settings->user-requests
3. Go to https://<funkwhaleinstance>/api/admin/federation/follow/
4. Reload userpage in mastodon or pleroma
## What happens?
In Mastodon and pleroma you see, the following-request is pending
In funkwhale as user, you do not see any following-request
In django-backend you can see the following-request as "not approved"
Approve the following-request make a green check appear instead of the black "?"
- mastodon/pleroma-user is not shown in funkwhale as follower
- mastodon/pleroma stays at "following requested" for the funkwhale-user
- no notifications about new titles or playlists on mastodon/pleroma
## What is expected?
I expect that i can approve following-requests from user-interface, that the following-requests are shown (and approveable)
Mastodon and Pleroma should receive notifications, when i upload or change my music/titles/playlists-library
## Context
<!--
The version of your instance can be found on the footer : Source code (x.y)
-->
**Funkwhale version(s) affected**: 1.0.1 and develop
- Instance configuration: nginx, manually installed from git
Mastodon search for funkwhale user
![image](/uploads/86c8ba081e126f66cc99b4e4e8ee9aed/image.png)
Mastodon klick on "Follow"
![image](/uploads/21ddf353085dd3e9b26e8b228c80a145/image.png)
Mastodon reload this page
![image](/uploads/8b11a34729bfd959f8a0a5b12e92db09/image.png)
Funkwhale Notifications (one request is shown twice)
![image](/uploads/9f7271e7c3bb1c420f9704c36828eef6/image.png)
Funkwhale show Following requests
![image](/uploads/98eb68a22ec7d45a158f8d830908eb18/image.png)
Funkwhale Django backend showing Following request
![image](/uploads/dbfc049c85287dc7170d0499678d36b1/image.png)
![image](/uploads/ac3b0149287753cf43f65c67e79f9e35/image.png)
Funkwhale Django request approved and saved
![image](/uploads/fd1ac378f93f785e27d456f3ad23b964/image.png)
Mastodon reload again following-page for funkwhale-user
![image](/uploads/389ac95f181cc45215c2c7fdf03ebb62/image.png)https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1809I-4 Automatic following of public libraries and channels2024-03-27T11:03:28ZpetitminionI-4 Automatic following of public libraries and channelsPart of #762
integrated into https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/1806
Already done for channels :
On Channel creation -> creation of a public actor related to the channel -> creation of an activity to decl...Part of #762
integrated into https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/1806
Already done for channels :
On Channel creation -> creation of a public actor related to the channel -> creation of an activity to declare the channel creation to all known domains .
To do :
global fed is enable -> discovery -> follow :
- [x] Discover funkwhale domains in network.funkwhale https://network.funkwhale.audio/api/domains
- [x] Discover domain by asking to known domains unknown domains info.
- [x] Follow all domains we have in db when global fed is enable (new task, will allow to follow domain we discovered if follow failed during discovery process)
- [ ] add to the doc the fact that channel will federate in any cases but libraries will only federate if global federation is enabled.1.5.0Ciarán Ainsworthsporiff@funkwhale.audiopetitminionCiarán Ainsworthsporiff@funkwhale.audiohttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2295Server Error when loading library pages in a new tab2024-03-23T04:18:09ZSophie WServer Error when loading library pages in a new tab<!--
Hi there! You are reporting a bug on this project, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure your issue re...<!--
Hi there! You are reporting a bug on this project, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure your issue respect our guidelines.
To ensure your bug report is as useful as possible, please try to stick
to the following structure. You can leave the parts text between `<!- ->`
markers untouched, they won't be displayed in your final message.
Please do not edit the following line, it's used for automatic classification
-->
## Steps to reproduce
<!--
Describe the steps to reproduce the issue, like:
1. Visit the page at /artists/
2. Type that
3. Submit
-->
1. Open a library page (for an artist, track, or album) in a new tab from the front-end.
2. Wait for that new tab to load.
Alternatively,
1. Navigate to a library page for an artist, track, or album
2. Refresh the browser page
3. Wait for the page to reload
## What happens?
<!--
Describe what happens once the previous steps are completed.
-->
The relevant library page fails to load, instead returning a Server Error 500 code.
![image](/uploads/012661ad8d5a6c366a9ddebdd4c70f63/image.png)
When the error occurs, the Funkwhale API container logs show a python stacktrace from the create_connection function in urllib3.
Attached is an example API log when trying to open track 744 of the instance in a new tab. <br>
_Note: The instance domain has been replace with '[instance.domain]'_
[api_-_error.log](/uploads/f86a36878d52cc92f2944ff94d203406/api_-_error.log)
## What is expected?
<!--
Describe the expected behaviour.
-->
The relevant library page will load normally, in the same way as it does when navigated to within an existing browser tab.
## Context
The issue only seems to occur when opening pages in a new tab. The same pages load correctly within an existing funkwhale tab.
The error occurred across all browsers I tried (Edge, Firefox, and Chrome on Windows 10; Chrome and Firefox on Android)
<!--
The version of your instance can be found on the footer : Source code (x.y)
-->
Funkwhale Version 1.4.0<br>
Instance type: Docker
<!--
If relevant, share additional context here like:
- Browser type and version (for front-end bugs)
- Instance configuration (Docker/non-docker, nginx/apache as proxy, etc.)
- Error messages, screenshots and logs
-->https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2275III-1 Implement collection feature2024-03-22T21:05:59ZpetitminionIII-1 Implement collection feature- forum : https://forum.funkwhale.audio/d/214-whats-wrong-with-libraries-and-a-path-to-fix-them/
- spec : https://docs.funkwhale.audio/develop/specs/collections/index.html- forum : https://forum.funkwhale.audio/d/214-whats-wrong-with-libraries-and-a-path-to-fix-them/
- spec : https://docs.funkwhale.audio/develop/specs/collections/index.htmlpetitminionpetitminionhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1781Can't follow channels in Mastodon after a migration2024-03-21T17:27:50ZSaci PererêCan't follow channels in Mastodon after a migration<!--
Hi there! You are reporting a bug on this project, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure your issue re...<!--
Hi there! You are reporting a bug on this project, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure your issue respect our guidelines.
To ensure your bug report is as useful as possible, please try to stick
to the following structure. You can leave the parts text between `<!- ->`
markers untouched, they won't be displayed in your final message.
Please do not edit the following line, it's used for automatic classification
-->
## Steps to reproduce
1. Install with migration from a old server following:
- https://docs.funkwhale.audio/installation/debian.html
- https://docs.funkwhale.audio/admin/migration.html
2. Try to follow a channel in Mastodon
<!--
Describe the steps to reproduce the issue, like:
1. Visit the page at /artists/
2. Type that
3. Submit
-->
## What happens?
<!--
Describe what happens once the previous steps are completed.
-->
1. Mastodon seems to follow without problems
![image](/uploads/df1eede053ea73de235127f5a8d31ffa/image.png)
2. After a while Mastodon pass the follow status to `pending`
![image](/uploads/e00ec5d06f38fa77a28c540a201ea28e/image.png)
3. In `journalctl -u funkwhale-worker.service`:
```
[2022-05-07 18:21:09,266: INFO/MainProcess] Task federation.dispatch_inbox[b4839bed-d11a-4b99-9e51-cafd997eef11] received
[2022-05-07 18:21:09,414: INFO/ForkPoolWorker-2] Task federation.dispatch_inbox[b4839bed-d11a-4b99-9e51-cafd997eef11] succeeded in 0.14362048543989658s: None
[2022-05-07 18:21:18,578: INFO/MainProcess] Task federation.dispatch_inbox[676d8e9f-04ff-4c22-a0f6-1d44320d5d77] received
[2022-05-07 18:21:18,734: INFO/MainProcess] Task federation.dispatch_outbox[9638b9d2-a5c4-480c-9951-e844d709e632] received
[2022-05-07 18:21:18,736: INFO/ForkPoolWorker-2] Task federation.dispatch_inbox[676d8e9f-04ff-4c22-a0f6-1d44320d5d77] succeeded in 0.15366541035473347s: None
[2022-05-07 18:21:18,780: INFO/ForkPoolWorker-1] Task federation.dispatch_outbox[9638b9d2-a5c4-480c-9951-e844d709e632] succeeded in 0.04417194426059723s: None
[2022-05-07 18:21:18,782: INFO/MainProcess] Task federation.deliver_to_remote_inbox[816573b9-b340-484e-953a-52c944642bb6] received
[2022-05-07 18:21:19,335: WARNING/ForkPoolWorker-2] [celery] Error during task 816573b9-b340-484e-953a-52c944642bb6: '_RSAPrivateKey' object has no attribute 'signer'
[2022-05-07 18:21:19,335: WARNING/ForkPoolWorker-2]
[2022-05-07 18:21:19,336: WARNING/ForkPoolWorker-2] Traceback (most recent call last):
[2022-05-07 18:21:19,336: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/celery/app/trace.py", line 450, in trace_task
R = retval = fun(*args, **kwargs)
[2022-05-07 18:21:19,336: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/celery/app/trace.py", line 731, in __protected_call__
return self.run(*args, **kwargs)
[2022-05-07 18:21:19,337: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/celery/app/autoretry.py", line 34, in run
return task._orig_run(*args, **kwargs)
[2022-05-07 18:21:19,337: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/api/funkwhale_api/taskapp/celery.py", line 57, in inner
return function(*args, **kwargs)
[2022-05-07 18:21:19,337: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/api/funkwhale_api/federation/tasks.py", line 149, in deliver_to_remote
response = session.get_session().post(
[2022-05-07 18:21:19,337: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/sessions.py", line 590, in post
return self.request('POST', url, data=data, json=json, **kwargs)
[2022-05-07 18:21:19,337: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/api/funkwhale_api/common/session.py", line 11, in request
return super().request(*args, **kwargs)
[2022-05-07 18:21:19,338: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/sessions.py", line 528, in request
prep = self.prepare_request(req)
[2022-05-07 18:21:19,338: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/sessions.py", line 456, in prepare_request
p.prepare(
[2022-05-07 18:21:19,338: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/models.py", line 320, in prepare
self.prepare_auth(auth, url)
[2022-05-07 18:21:19,338: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/models.py", line 556, in prepare_auth
r = auth(self)
[2022-05-07 18:21:19,338: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests_http_signature/__init__.py", line 94, in __call__
raw_sig = Crypto(self.algorithm).sign(string_to_sign=self.get_string_to_sign(request, self.headers),
[2022-05-07 18:21:19,338: WARNING/ForkPoolWorker-2] File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests_http_signature/__init__.py", line 25, in sign
signer = key.signer(padding=self.PKCS1v15(), algorithm=hasher)
[2022-05-07 18:21:19,339: WARNING/ForkPoolWorker-2] AttributeError: '_RSAPrivateKey' object has no attribute 'signer'
[2022-05-07 18:21:19,339: ERROR/ForkPoolWorker-2] Task federation.deliver_to_remote_inbox[816573b9-b340-484e-953a-52c944642bb6] raised unexpected: AttributeError("'_RSAPrivateKey' object has no attribute 'signer'")
Traceback (most recent call last):
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/celery/app/trace.py", line 450, in trace_task
R = retval = fun(*args, **kwargs)
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/celery/app/trace.py", line 731, in __protected_call__
return self.run(*args, **kwargs)
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/celery/app/autoretry.py", line 34, in run
return task._orig_run(*args, **kwargs)
File "/srv/funkwhale/api/funkwhale_api/taskapp/celery.py", line 57, in inner
return function(*args, **kwargs)
File "/srv/funkwhale/api/funkwhale_api/federation/tasks.py", line 149, in deliver_to_remote
response = session.get_session().post(
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/sessions.py", line 590, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/srv/funkwhale/api/funkwhale_api/common/session.py", line 11, in request
return super().request(*args, **kwargs)
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/sessions.py", line 528, in request
prep = self.prepare_request(req)
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/sessions.py", line 456, in prepare_request
p.prepare(
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/models.py", line 320, in prepare
self.prepare_auth(auth, url)
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests/models.py", line 556, in prepare_auth
r = auth(self)
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests_http_signature/__init__.py", line 94, in __call__
raw_sig = Crypto(self.algorithm).sign(string_to_sign=self.get_string_to_sign(request, self.headers),
File "/srv/funkwhale/virtualenv/lib/python3.9/site-packages/requests_http_signature/__init__.py", line 25, in sign
signer = key.signer(padding=self.PKCS1v15(), algorithm=hasher)
AttributeError: '_RSAPrivateKey' object has no attribute 'signer'
```
## What is expected?
Don't change status to `pending` and accept the follow request
<!--
Describe the expected behaviour.
-->
## Context
<!--
The version of your instance can be found on the footer : Source code (x.y)
-->
**Funkwhale version(s) affected**: 1.2.4
Nginx as proxy
<!--
If relevant, share additional context here like:
- Browser type and version (for front-end bugs)
- Instance configuration (Docker/non-docker, nginx/apache as proxy, etc.)
- Error messages, screenshots and logs
-->https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1262Account-name, channel-name, confusion and clarification2024-03-12T15:43:17ZPorrumentzioAccount-name, channel-name, confusion and clarification## What is the problem you are facing?
A problem I had and more people have when creating an account on Funkwhale is that it's not easy to know that the account name is not same as channel-name.
When creating an account I used my artist ...## What is the problem you are facing?
A problem I had and more people have when creating an account on Funkwhale is that it's not easy to know that the account name is not same as channel-name.
When creating an account I used my artist name thinking that I could directly upload there my songs, but then I realized that I had to create another channel name for that, but the name was caught (by me).
## Proposals
### Change name managing
It may be possible to change how account, channel... names are managed, to separate somehow the names caught on account/user-names from channel-names; then the explained problem would be avoided
### Warning when creating account
Another solution is to put a warning while creating an account to inform the user that the account they're creating is not same as channel/artist page, and that then, they should take that into account when choosing the account-name.
## What are the possible drawbacks or issues with the requested changes?
Changing the name managing would be a great problem because it should change all the structure of Funkwhale. The other proposal has no drawbacks.https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2294Add support for YouTube feeds2024-03-12T04:15:08ZLoren BurkholderAdd support for YouTube feeds<!--
Hi there! You are about to share feature request or an idea, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure yo...<!--
Hi there! You are about to share feature request or an idea, and we want to thank you!
If it's the first time you post here, please take a moment to read our Code of Conduct
(https://funkwhale.audio/code-of-conduct/) and ensure your issue respect our guidelines.
To ensure we can deal with your idea or request, please try to stick
to the following structure. You can leave the parts text between `<!- ->`
markers untouched, they won't be displayed in your final message.
Please do not edit the following line, it's used for automatic classification
-->
## What is the problem you are facing?
<!--
Describe the problem you'd like to solve, and why we need to add or
improve something in the current system to solve that problem.
Be as specific as possible.
-->
I'd like to subscribe to certain podcasts that are distributed via YouTube (e.g. LTT's WAN Show). YouTube does allow you to create a feed for individual channels and playlists (for example, [this](https://www.youtube.com/feeds/videos.xml?playlist_id=PL8mG-RkN2uTw7PhlnAr4pZZz2QubIbujH) is the WAN Show playlist feed), but Funkwhale's RSS client doesn't properly recognize these feeds.
## What are the possible drawbacks or issues with the requested changes?
<!--
Altering the system behaviour is not always a free action, and it can impact
user experience, performance, introduce bugs or complexity, etc..
If you think about anything we should keep in mind while
examining your request, please describe it in this section.
-->
Since YouTube distributes videos, Funkwhale would have to either convert the videos to audio or add a video player for these podcasts (similar to how Spotify embeds video for some podcasts).https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2293Embed player with long title : controls not shown when width is set to a fixe...2024-03-08T14:34:19ZGuillaume VandenhoveEmbed player with long title : controls not shown when width is set to a fixed size## Steps to reproduce
1. Upload a track with a relatively long title (>80 characters)
2. Embed the track with a fixed width (e.g 800px). For height it does not matter : even if you increase default height (150px), you just get a gray b...## Steps to reproduce
1. Upload a track with a relatively long title (>80 characters)
2. Embed the track with a fixed width (e.g 800px). For height it does not matter : even if you increase default height (150px), you just get a gray background
## What happens?
You don't see the controls
## What is expected?
You see the widget as expected
## Context
You can try with the following file : https://sonotheque.cemea.org/library/tracks/65
Embedded with `width=800px` (and `height=150px`, the default value) it looks like this :
![Screenshot_from_2024-03-06_17-17-56](/uploads/da4c605da518b71c46ab08793a8f5391/Screenshot_from_2024-03-06_17-17-56.png)
If I reduce the size of the h1 enough (with dev tools), I can see the controls again, albeit a bit cut off :
![Screenshot_from_2024-03-06_17-20-35](/uploads/29f491de08f7ab82f8450e914ad9aede/Screenshot_from_2024-03-06_17-20-35.png)
Embedded with `width=800px` (and `height=400px`) it looks like this : (tested on an empty HTML file to make sure nothing is interfering) :
![Screenshot_from_2024-03-06_16-55-03](/uploads/fd64b8088d6985c7584cf2baf6a367ae/Screenshot_from_2024-03-06_16-55-03.png)
**Funkwhale version(s) affected**: 1.4.0, 1.4.2
This happens on Firefox 123.0 on Linux, Chromium 121 on Linux, and Firefox 123.0 on Windows.https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/1456IV-2 User-level blocking and muting2024-03-04T18:06:03ZGeorg KrauseIV-2 User-level blocking and mutingGive users control over the content they see and broadcast within the app by allowing them to block or mute other users, artists or channels.
- forum : https://forum.funkwhale.audio/d/562-user-level-blocking-and-muting
- spec : https://...Give users control over the content they see and broadcast within the app by allowing them to block or mute other users, artists or channels.
- forum : https://forum.funkwhale.audio/d/562-user-level-blocking-and-muting
- spec : https://pad.funkwhale.audio/UZ7YFKn1SUCOxSwGpuMasApetitminionpetitminionhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/741Change the way media is imported, stored and taken care of2024-03-01T05:58:36Zgerry_the_hatChange the way media is imported, stored and taken care of## What is the problem you are facing?
From my perspective the whole concept of importing, storing and handling media should be changed.
1st: Importing
As far as I understand, there are two ways of making media playable in Funkwhale: ...## What is the problem you are facing?
From my perspective the whole concept of importing, storing and handling media should be changed.
1st: Importing
As far as I understand, there are two ways of making media playable in Funkwhale: Importing (meaning copying, which is pretty sic, BTW) and "linking". Importing is not what a user usually wants, as their data is and will be stored somewhere else (and Funkwhale is not a storage server or something). This is especially true when dealing with container setups. Having data redundant is good when talking about data availability and protection (backups), but not here.
2nd: "linking"
What I'm talking about is what's noted in the docs as "in-place" importing. This method is much better. The drawback is, that it is static. Quote from https://docs.funkwhale.audio/importing-music.html:
"While in-place import is faster and less disk-space-hungry, it’s also more fragile: if, for some reason, you move or rename the source files, Funkwhale will not be able to serve those files anymore.
Thus, be especially careful when you manipulate the source files."
Very true. Fragile sounds like... unreliable, troublesome, a pain. And we don't want such a thing, right?
3rd: rescanning / re-linking metadata
As we just have seen, Funkwhale expects a static media library, and no library is static. Musicbrainz Picard is recommended for tagging, which I really appreciate, as I'm a long term user and contributor to Musicbrainz in general. What I've learned in all those years is that the metadata get changed all the time as new info is added, false sorted out or corrected. Some kind if rescanning is needed, as well as a cleanup. With cleanup I mean something that deletes obsolete data from Funkwhale's database and prevents the user from seeing double entries.
4th: UI vs. CMD
The whole process should be ported into the UI as a part of library setup.
## What are the possible drawbacks or issues with the requested changes?
- this ticket might need to be broken into smaller junks
- effort needed is high
- might be a good idea to do conceptual and strategic work at first, as this is not a easy task
## Context
Well, I'm new to Funkwhale and find this all very user unfriendly and unmodern. Should be straight forward and easy.1.0AgateAgatehttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2290update postgresql2024-03-01T04:17:00Zpetitminionupdate postgresql`django.db.utils.NotSupportedError: PostgreSQL 12 or later is required (found 11.22).`
We probably might want to upgrade to the newest version of postgres ?`django.db.utils.NotSupportedError: PostgreSQL 12 or later is required (found 11.22).`
We probably might want to upgrade to the newest version of postgres ?https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2079II-2 Listening and favorite synchronization with ListenBrainz2024-02-29T15:04:42ZpetitminionII-2 Listening and favorite synchronization with ListenBrainzHas agreed by email with Nlnet, the user-follow sync is dropped out in favour of listening synchronization.
- forum : https://forum.funkwhale.audio/d/404-how-do-you-want-favorite-synchronization-with-listenbrainz-to-work https://foru...Has agreed by email with Nlnet, the user-follow sync is dropped out in favour of listening synchronization.
- forum : https://forum.funkwhale.audio/d/404-how-do-you-want-favorite-synchronization-with-listenbrainz-to-work https://forum.funkwhale.audio/d/406-listening-synchronization-with-listenbrainz
- spec : https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2652
- mr : https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2658petitminionpetitminionhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2292allow short password for superuser2024-02-28T17:08:35Zpetitminionallow short password for superuser`funkwhale-manage fw users create --superuser` do not allow short passwords anymore. This is annoying for development. We should add the deprecated option
also allow empty mail`funkwhale-manage fw users create --superuser` do not allow short passwords anymore. This is annoying for development. We should add the deprecated option
also allow empty mailhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2291update tag field CICharField2024-02-27T22:30:52Zpetitminionupdate tag field CICharField`WARNINGS:
tags.Tag.name: (fields.W905) django.contrib.postgres.fields.CICharField is deprecated. Support for it (except in historical migrations) will be removed in Django 5.1.
HINT: Use CharField(db_collation="…") with a case-i...`WARNINGS:
tags.Tag.name: (fields.W905) django.contrib.postgres.fields.CICharField is deprecated. Support for it (except in historical migrations) will be removed in Django 5.1.
HINT: Use CharField(db_collation="…") with a case-insensitive non-deterministic collation instead.`petitminionpetitminionhttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2289Issues with tauri app2024-02-27T10:46:10ZGeorg KrauseIssues with tauri appI do have some minor issues:
- The player info doesn't update, it always shows 0:00 | 0:00
- The orange progress bar is always at 100%
- When a track finishes, the next one doesn't play, only the first second is played.
![screenshot](/...I do have some minor issues:
- The player info doesn't update, it always shows 0:00 | 0:00
- The orange progress bar is always at 100%
- When a track finishes, the next one doesn't play, only the first second is played.
![screenshot](/uploads/49e82e88b13e586a2f9fae1ee8aa1d49/screenshot.jpg)
Log when playback of next track fails:
```
** (funkwhale:182083): WARNING **: 11:45:03.382: atk-bridge: get_device_events_reply: unknown signature
WebKit wasn't able to find a WebVTT encoder. Subtitles handling will be degraded unless gst-plugins-bad is installed.
```Kasper Sewerynwvffle@funkwhale.audioKasper Sewerynwvffle@funkwhale.audiohttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2288Issues starting App Image2024-02-27T10:33:52ZGeorg KrauseIssues starting App ImageReported by @petitminion on Matrix:
petitminion
11:40
in my kubuntu system with plasma 5.27 funkwhale: symbol lookup error: /tmp/.mount_FunkwhdoTj5q/usr/lib/libpango-1.0.so.0: undefined symbol: hb_ot_layout_get_horizontal_baseline_tag_...Reported by @petitminion on Matrix:
petitminion
11:40
in my kubuntu system with plasma 5.27 funkwhale: symbol lookup error: /tmp/.mount_FunkwhdoTj5q/usr/lib/libpango-1.0.so.0: undefined symbol: hb_ot_layout_get_horizontal_baseline_tag_for_script
maybe https://github.com/AppImageCommunity/pkg2appimage/commit/f2df956789f36204213876c96500c8b05595e43bKasper Sewerynwvffle@funkwhale.audioKasper Sewerynwvffle@funkwhale.audiohttps://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2287Follow-up from "feat: add tauri" - Create a login/register page2024-02-27T08:41:59ZKasper Sewerynwvffle@funkwhale.audioFollow-up from "feat: add tauri" - Create a login/register pageThe following discussion from !2701 should be addressed:
- [ ] @wvffle started a [discussion](https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2701#note_61260): (+3 comments)
> I think it would be a good idea to de...The following discussion from !2701 should be addressed:
- [ ] @wvffle started a [discussion](https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2701#note_61260): (+3 comments)
> I think it would be a good idea to design a full page instance chooser screen and a login/register screen in similar style. Currently, when you navigate to the login page of an instance, you can click on any link and exit the login flow.Mathieu JourdanMathieu Jourdan